正在尝试处理 Activity 中服务触发的事件

Trying to handle event triggered by Service in the Activity

我有一个后台 Service 可以触发事件并为我的应用构建通知。如果单击,通知应打开 MainActivity,并根据发送的信息,打开此 Activity 中的我的一个片段。为此,Notification 包含一个 PendingIntent 将数据保存到 Intent 的 Bundle.

此触发事件有三种情况:

  1. 应用程序在前台:我的服务发送一个 Broadcast 并且我在 Activity 中的 BroadcastReceiver 获取事件并处理它。不需要 Notification。效果很好。
  2. 应用程序终止:PendindIntent 重新打开我的应用程序,我的 Activity 使用 getIntent().getExtras() 通过 Bundle 访问我的信息。一切正常。
  3. 后台应用程序:Activity 已创建,因此 BroadcastReceiver 已注册。我点击我的通知,但没有任何反应。我既没有收到广播消息,也无法访问我的 Bundle(使用 getIntent().getExtras() 在 onResume 中检查它,它是空的)。

有没有想过如何解决第三种情况?

创建通知的代码:

private void createNotification() {
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
    mBuilder.setSmallIcon(R.drawable.my_icon);
    mBuilder.setContentTitle("My App");
    mBuilder.setContentText("Notification message");

    Bundle bundle = new Bundle();
    bundle.putString(MainActivity.OPEN_FRAGMENT, "myFragment");
    Intent resultIntent = new Intent(this, MainActivity.class);
    resultIntent.putExtra("myInfo","myInfo");
    resultIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    resultIntent.putExtras(bundle);

    PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    mBuilder.setContentIntent(resultPendingIntent);
    mBuilder.setAutoCancel(true);

    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(0, mBuilder.build());
}

你试过改变吗

PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent, 0);

终于找到解决办法了!

我的情况是这样的:

  1. 应用前台:服务发送广播。 Activity 接收并处理事件。
  2. 应用已终止:点击了通知,启动了 PendingIntent。应用重新打开并使用 Bundle 中的信息处理事件。
  3. 应用程序在后台:点击了通知,它发送了一个 PendingIntent,但是 Activity 已经 运行 所以它不会覆盖它,这就是什么都没有发生的原因。

解决方法:重写 onNewIntent 方法:

@Override
protected void onNewIntent(Intent intent) { // Receives the PendingIntent
    super.onNewIntent(intent);
    if (intent.getExtras() != null && intent.getExtras().getString(OPEN_MY_FRAGMENT) != null) {
        // TODO something with intent.getExtras().getString("myInfo");
    }
}