在PendingIntent中使用时,FLAG_ACTIVITY_NEW_TASK的行为不符合预期

时间:2014-05-23 22:07:10

标签: android android-intent notifications android-pendingintent

好的,在这里忍受我

我的应用程序由启动画面活动(A)和主要活动(B)组成。当应用程序启动时,(A)显示一点,然后启动(B)。之后(A)结束。这在“正常”条件下工作正常。这是要启动的代码(B)

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        Intent mainIntent = new Intent(A.this, B.class);
        startActivity(mainIntent);
        finish();
    }
}, SPLASH_DELAY);

当通知到达时,用户点击它。我是通过PendingIntent:

开始的(A)
Intent mIntent = new Intent(this, A.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, mIntent, PendingIntent.FLAG_CANCEL_CURRENT);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this).setSmallIcon()... //build the whole notification
mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(0, mBuilder.build());

这开始于(A)然后是(B)并且一切都很好。

然而...

一旦应用程序在屏幕上显示并且第二个通知到达(A)不再启动,也不会在(B)中收到任何回调

阅读http://developer.android.com/guide/components/tasks-and-back-stack.html#ActivityState处的文档我得出结论,我应该开始(A)设置 FLAG_ACTIVITY_NEW_TASK (这样只有在(A)尚未运行时它才会启动新任务)我也应该用( FLAG_ACTIVITY_SINGLE_TOP 标志开始(B)(所以我可以回复 B.onNewIntent(),因为B将会运行)。所以我做了

...
mainIntent.setFlags(FLAG_ACTIVITY_NEW_TASK);
....

mIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
....

但是,唉,没有。这种行为似乎根本没有改变。

我是否遗漏了文档中的内容?在我看来, FLAG_ACTIVITY_NEW_TASK 应该每次都在我的情况下开始(A),因为到第二个通知到达时。 (A)已经完成,但它没有做任何事情。

您能否告诉我如何获得任何回调,以便向用户显示正确的信息?

由于

1 个答案:

答案 0 :(得分:8)

对于通知,您已为任务的根活动(“开始”活动)创建了PendingIntent,并且您已设置FLAG_ACTIVITY_NEW_TASK。这将执行以下操作:

  • 如果您的应用程序未运行,它将创建一个新任务并在其中启动活动A

  • 如果您的应用程序已在运行(即:已经有一个活动任务是通过启动活动A启动的,即使活动A不再存在),它也会带来该任务在前景中处于任何状态。不会创建任何新活动,也不会在任何现有活动上调用onNewIntent()。这是“将我的任务带到前台”的纯粹“简写”,类似于用户从“最近任务列表”中选择应用程序时发生的情况。

如果您希望应用程序在每次用户点击通知时获取某些信息,那么您需要:

  • 使用您从通知中启动的单独活动。此活动不得根活动(即:应用程序的“开始”活动。此活动将在用户选择通知时启动。如果您的应用程序已在运行,此活动将是启动到应用程序的现有任务中。然后可以确定应用程序是否已在运行(使用Activity.isTaskRoot()来确定)并执行适当的操作(例如,如果应用程序尚未运行,则启动根活动)。

  • 从通知中启动根活动时,请使用以下标志组合:FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP。这将从根活动之上的任务中删除任何其他活动,并将在根活动上调用onNewIntent()。这是你的“回调”。 注意:只有在您的根活动(启动活动)尚未完成时才会 这意味着当活动A开始活动B时,不得致电finish()