我有一个使用的应用程序城市飞艇 http://urbanairship.com/用于推送通知。当通知到达并且用户单击它时,我的应用程序中的活动 A 应该打开并执行某些操作。
我已经安装了BroadcastReceiver
如图所示在文档中 http://docs.urbanairship.com/build/android_features.html#custom-handling-of-push-events,它是almost在职的。
- 当我的应用程序位于前台时,我根本不让用户看到通知,而只是自动处理它。
- 当我的应用程序根本没有运行时,活动就可以正常打开。
- 当我的应用程序处于后台时(当 A 是顶级 Activity 时总是会发生这种情况),创建了 Activity A 的第二个实例.
这当然是一个问题。我不想要两项 A 活动,我只想要其中一项。这是相关的BroadcastReceiver
code:
@Override
public void onReceive(Context ctx, Intent intent)
{
Log.i(tag, "Push notification received: " + intent.toString());
String action = intent.getAction();
int notificationId = intent.getIntExtra(PushManager.EXTRA_NOTIFICATION_ID, -1);
if(action.equals(PushManager.ACTION_NOTIFICATION_OPENED))
{
Intent intentActivity = new Intent(ctx, ActivityA.class);
intentActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
UAirship.shared().getApplicationContext().startActivity((intentActivity);
}
}
更新:
我试图通过调用绕过这个错误System.exit(0)
当用户在 Activity A 上按 Back 时。该过程结束,但随后立即重新启动!我的 BroadcastReceiver 在第二个实例中不会再次被调用。发生了什么?
更新2:
@codeMagic 询问有关应用程序和活动 A 的更多信息。
该应用程序允许用户查看某些项目并对其发表评论。 Activity A 在应用程序启动时启动。如果用户的会话不再有效,则会启动登录活动。用户登录后,活动 A 再次激活。 A 只有一条“没有要查看的项目”消息和一个“立即尝试”按钮。
当用户登录时,每当有新项目可供查看时,服务器就会开始发送推送通知。当应用程序收到通知时,活动 A 访问服务器并获取下一个要查看的项目。该项目显示在活动 B 中。审核提交到服务器后,活动 B 完成,活动 A 再次成为顶级活动。
服务器知道用户何时正在审阅某个项目(因为活动 A 获取了该项目),并且在提交审阅之前不会发送推送通知 - 这意味着如果用户未登录或用户未登录,则不会发送通知正在查看活动 B.
虽然我同意这里存在微妙的竞争条件,但它并没有导致我所看到的问题 - 在测试中我 100% 肯定不存在竞争条件 - 仅发送推送通知after活动 A 再次变为活动状态。