正在尝试处理 Activity 中服务触发的事件
Trying to handle event triggered by Service in the Activity
我有一个后台 Service
可以触发事件并为我的应用构建通知。如果单击,通知应打开 MainActivity
,并根据发送的信息,打开此 Activity
中的我的一个片段。为此,Notification
包含一个 PendingIntent
将数据保存到 Intent 的 Bundle
.
此触发事件有三种情况:
- 应用程序在前台:我的服务发送一个
Broadcast
并且我在 Activity
中的 BroadcastReceiver
获取事件并处理它。不需要 Notification
。效果很好。
- 应用程序终止:
PendindIntent
重新打开我的应用程序,我的 Activity
使用 getIntent().getExtras()
通过 Bundle
访问我的信息。一切正常。
- 后台应用程序: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);
终于找到解决办法了!
我的情况是这样的:
- 应用前台:服务发送广播。 Activity 接收并处理事件。
- 应用已终止:点击了通知,启动了 PendingIntent。应用重新打开并使用 Bundle 中的信息处理事件。
- 应用程序在后台:点击了通知,它发送了一个 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");
}
}
我有一个后台 Service
可以触发事件并为我的应用构建通知。如果单击,通知应打开 MainActivity
,并根据发送的信息,打开此 Activity
中的我的一个片段。为此,Notification
包含一个 PendingIntent
将数据保存到 Intent 的 Bundle
.
此触发事件有三种情况:
- 应用程序在前台:我的服务发送一个
Broadcast
并且我在Activity
中的BroadcastReceiver
获取事件并处理它。不需要Notification
。效果很好。 - 应用程序终止:
PendindIntent
重新打开我的应用程序,我的Activity
使用getIntent().getExtras()
通过Bundle
访问我的信息。一切正常。 - 后台应用程序: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);
终于找到解决办法了!
我的情况是这样的:
- 应用前台:服务发送广播。 Activity 接收并处理事件。
- 应用已终止:点击了通知,启动了 PendingIntent。应用重新打开并使用 Bundle 中的信息处理事件。
- 应用程序在后台:点击了通知,它发送了一个 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");
}
}