我有一个活动,其启动模式为singleTop(在清单中(。我的理解是,如果一个活动是singleTop并且它位于活动堆栈的顶部,那么使用新的意图启动活动实际上会导致在活动上调用onNewIntent((,而不会创建活动的新实例(因此,onCreate((不会被调用(。
此活动运行显示持续通知的前台服务。选中后,此通知只是将用户带回堆栈顶部的活动(没有从此 singleTop 活动启动任何活动(。我的问题是,当选择通知时,有时会创建活动的新实例——即使它明显已经在堆栈顶部。这对我的活动来说是有问题的,因为它的行为对于它在后台被杀死并重新启动的情况是不同的(与刚刚使用 onNewIntent(( 放在前面(。我的服务用于显示通知的代码如下所示:
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MainActivity.class);
Intent notificationIntent = new Intent(this, MyProblematicActivity.class);
notificationIntent.putExtra(EXTRA_MY_DATA, "MyData");
stackBuilder.addNextIntent(notificationIntent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
Notification.Builder notificationBuilder = new Notification.Builder(getApplicationContext()).
setSmallIcon(smallIconResourceId).
setContentTitle(contentTitle).
setContentText(contentText).
setAutoCancel(false).
setOngoing(true).
setContentIntent(pendingIntent);
startForeground(MY_NOTIF_ID, notificationBuilder.build());
我说这种行为有时会发生,当它发生时,它会反复发生。例如:
- MyProblemActivity 首次上线
- 服务启动并显示通知
- 已选择通知。
- 再次创建 MyProblemActivity (服务已启动,通知已显示(。
- 重复 2-4 次前置。
有时,在 #3 之后,MyProblemActivity 的 onNewIntent(( 会在不创建新实例的情况下被调用,并且事情按预期工作。
我不知道为什么会发生这种情况。任务根目录下的状态活动是否会对我的 singleTop 活动的行为产生任何影响?FWIW,创建 MyProblemActivity 的活动是单个任务活动。
您遇到此问题是因为您正在使用 TaskStackBuilder is that it always resets the task, which means that the
Activity TaskStackBuilder. The behaviour of
will be created again. Don't use
TaskStackBuilder for this, just call
PendingIntent.getActivity(( to get a
PendingIntent to add to your
Notification'。
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
将此标志添加到通知意向
我用同样的事情回答 Komal 所说的话,但只是为了解释这整件事背后的原因,
如果使用singleTop
,则只有当您的目标活动位于堆栈顶部时,才会调用新实例,如果它不在顶部,则onNewIntent()
接收新意图;因此会创建新实例。
所以
添加标志Intent.FLAG_ACTIVITY_CLEAR_TOP
如果向上导航到当前堆栈上的某个活动,则行为由父活动的启动模式确定。如果父活动具有启动模式 singleTop(或向上意图包含 FLAG_ACTIVITY_CLEAR_TOP(,则父活动将带到堆栈的顶部,并保留其状态。导航意图由父活动的 onNewIntent(( 方法接收。如果父活动具有启动模式标准(并且 up 目的不包含 FLAG_ACTIVITY_CLEAR_TOP(,则当前活动及其父活动都将从堆栈中弹出,并创建父活动的新实例以接收导航意图。
文档