好的,在这里忍受我
我的应用程序由启动画面活动(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)已经完成,但它没有做任何事情。
您能否告诉我如何获得任何回调,以便向用户显示正确的信息?
由于
答案 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()