活动开了两次

zmb*_*mbq 6 android broadcastreceiver android-activity

我有一个使用Urban Airship进行推送通知的应用程序.当通知到达并且用户点击它时,我的应用程序中的活动A应该打开并执行某些操作.

我安装了文档中BroadcastReceiver显示的内容,它几乎正常工作.

  1. 当我的应用程序在前台时,我根本不让用户看到通知,只是自动处理它.
  2. 当我的应用程序根本没有运行时,活动就会很好地打开.
  3. 当我的应用程序处于后台时(总是在A是最高活动时发生),将创建活动A的第二个实例.

当然,这是一个问题.我不想要两个A活动,我只想要其中一个.这是相关的BroadcastReceiver代码:

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:我试图通过System.exit(0)在用户按下Back on Activity A时调用来绕过此错误.该过程结束,但随后立即重新启动!我的BroadcastReceiver在第二个实例中没有被再次调用.发生了什么?

更新2:@codeMagic要求提供有关应用和活动A的更多信息.

此应用程序允许其用户查看某些项目并对其进行评论.应用程序启动时启动活动A. 如果用户的会话不再有效,则启动Login活动.用户登录后,活动A将再次变为活动状态.A只有"无需审核的项目"消息和"立即尝试"按钮.

当用户登录时,只要有新项目可供审阅,服务器就会开始发送推送通知.当应用程序收到通知时,活动A访问服务器并获取要审核的下一个项目.该项目显示在活动B中.一旦将评论提交给服务器,活动B就完成,活动A再次成为最高活动.

服务器知道用户何时正在查看某个项目(因为活动A获取了该项目),并且在提交审核之前不发送推送通知 - 这意味着如果用户未登录或用户未通知则无法通知正在观看活动B.

虽然我同意这里有一个微妙的竞争条件,但它并没有引起我所看到的问题 - 在测试中我100%肯定没有竞争条件 - 推送通知仅活动A再次激活发送.

zmb*_*mbq 20

解决方案是launchMode='singleTask'在活动中添加一个AndroidManifest.xml.因此,onNewIntent调用相同活动实例而不是新活动.