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

use*_*003 1 notifications android android-intent 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);
Run Code Online (Sandbox Code Playgroud)

当通知到达时,用户点击它.我是通过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());
Run Code Online (Sandbox Code Playgroud)

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

然而...

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

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

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

mIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
....
Run Code Online (Sandbox Code Playgroud)

但是,不,不.这种行为似乎根本没有改变.

我错过了文档中的内容吗?在我看来,每次在我的情况下FLAG_ACTIVITY_NEW_TASK应该开始(A),因为到第二个通知到达时.(A)已经完成,但它什么也没做.

你能给我一些关于如何获得回调的信息,这样我就能向用户显示正确的信息吗?

谢谢

Dav*_*ser 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()