【发布时间】:2016-04-23 16:44:30
【问题描述】:
我想从另一个类调用 MainActivity 中的 notify() 方法。我就是这样做的:
public class MyAlarmService extends Service{
@Override
public IBinder onBind(Intent arg0)
{
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate()
{
// TODO Auto-generated method stub
super.onCreate();
}
@SuppressWarnings("static-access")
@Override
public void onStart(Intent intent, int startId)
{
super.onStart(intent, startId);
String title = "title";
String message = "message";
new MainActivity().Notify(title, message);
...
主活动:
public class MainActivity extends Activity {
NotificationManager manager;
Notification myNotication;
@Override
protected void onCreate(Bundle savedInstanceState) {
manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
...
public void Notify(String notificationTitle, String notificationMessage){
Intent intent = new Intent("com.xxxx.app.MainActivity");
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 1, intent, 0);
Notification.Builder builder = new Notification.Builder(MainActivity.this);
builder.setAutoCancel(false);
builder.setTicker("this is ticker text");
builder.setContentTitle("Notification");
builder.setContentText("Text");
builder.setSmallIcon(R.drawable.infoicon);
builder.setContentIntent(pendingIntent);
builder.setOngoing(true);
builder.setSubText("This is subtext...");
builder.setNumber(100);
builder.build();
myNotication = builder.getNotification();
manager.notify(11, myNotication);
}
...
但我收到一条错误消息:
致命异常:主要 进程:com.xxxx.app,PID:10311 java.lang.RuntimeException:无法使用 Intent { cmp=com.xxxx.app/.MyAlarmService } 启动服务 com.xxxx.app.MyAlarmService@636e513:java.lang.NullPointerException:尝试调用虚拟方法'java .lang.String android.content.Context.getPackageName()' 在空对象引用上 在 android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3027) 在 android.app.ActivityThread.-wrap17(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1442) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String android.content.Context.getPackageName()” 在 android.content.ContextWrapper.getPackageName(ContextWrapper.java:133) 在 android.app.PendingIntent.getActivity(PendingIntent.java:305) 在 android.app.PendingIntent.getActivity(PendingIntent.java:272) 在 com.xxxx.app.MainActivity.Notify(MainActivity.java:304) 在 com.xxxx.app.MyAlarmService.onStart(MyAlarmService.java:41) 在 android.app.Service.onStartCommand(Service.java:459) 在 android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3010) 在 android.app.ActivityThread.-wrap17(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1442) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
【问题讨论】:
-
1) 复制服务中的 Notify 方法。然后在需要的地方调用它。为了触发通知,Notification Service 需要 Context 或者 Activity 或者 service)
-
Intent intent = new Intent("com.xxxx.app.MainActivity");这是创建 Intent 的一种方法,但容易出错。 -
除此之外,
new MainActivity().Notify(title, message);会导致错误,因为您不应该这样做new MainActivity(),因为它不受 Android 生命周期管理
标签: java android nullpointerexception null notifications