【问题标题】:Android Notification from non-activity class来自非活动类的 Android 通知
【发布时间】: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


【解决方案1】:

您可以通过以下方式进行相同的操作:

1) 将该 Notify 方法复制到服务中,并在需要触发通知的任何地方调用它,通知服务需要 Activity 或服务的上下文)

2) 您可以通过广播接收器从服务与活动通信

3) 你可以使用aidl来做

【讨论】:

    【解决方案2】:

    onStart() 方法内的Service 类中触发通知,并使用Intent 从MainActivity 类启动服务。另外,不要忘记在清单中声明您的服务。

    以下是从活动启动服务的代码: Intent intent = new Intent(this, MyAlarmService.class); startService(intent);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 2018-07-08
      • 2013-05-29
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 2017-02-01
      • 2020-11-19
      相关资源
      最近更新 更多