当我将我的应用程序带到前台时,没有加载最后一个 activity
When I bring my app to the foreground doesn´t load the last activity
我遇到了意外行为:
- Activity A = 启动器 activity
- Activity B = 从通知开始
当我关闭应用程序并从通知打开它时,Activity B 启动。
所以,当我点击主页按钮时,应用程序导航到 Activity A。
然后,我按下“返回”按钮,应用程序进入后台,我进入 Android 主屏幕。
这没问题,但如果我打开最近的应用程序菜单并再次 select 我的应用程序,它会加载 Activity B 而不是我预期的 Activity A。我真的不知道发生了什么。
通知生成器中设置的意图是:
Intent intent = new Intent(this, ActivityB.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
在Activity B 我有:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (id == android.R.id.home) {
Intent intent = new Intent(ActivityB.this, ActivityA.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
有什么想法或建议吗?
您可以改用 FLAG_ACTIVITY_REORDER_TO_FRONT
标志,它只会对活动重新排序,而不是 FLAG_ACTIVITY_CLEAR_TOP
,后者会删除其上的其他活动。
例如,当使用 FLAG_ACTIVITY_REORDER_TO_FRONT
考虑一项由四个活动组成的任务:A, B, C, D
。如果 D
使用解析为 activity B 的组件的 Intent
调用 startActivity()
,则 B 将被带到历史堆栈的前面,结果顺序为: A, C, D, B
。如果还指定了 FLAG_ACTIVITY_CLEAR_TOP
,则此标志将被忽略。
你可以参考这个link:https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT
发生这种情况的原因是最近任务列表中的任务是从 Notification
以 ActivityB
作为根 Activity
开始的。如果您从最近任务列表中选择此任务,Android 会将现有任务置于前台。但是,如果任务中没有活动活动(所有活动都已完成),则 Android 会再次从该任务启动根 Activity
。
如果应用程序是从 Notification
启动的,您需要阻止该应用程序被添加到最近任务列表中。您可以通过添加:
android:excludeFromRecents="true"
到 ActivityB
的清单条目。
我找到了符合我预期的解决方案。
当我收到通知时,我创建了一个新的任务堆栈,我的 mainActivity 位于顶部:
Intent intent = new Intent(this, ActivityB.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(ActivityB.class);
stackBuilder.addNextIntent(intent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
现在,我还可以删除 Activity B:
中对主页按钮的覆盖检查
// This can be now removed
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (id == android.R.id.home) {
Intent intent = new Intent(ActivityB.this, ActivityA.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
我遇到了意外行为:
- Activity A = 启动器 activity
- Activity B = 从通知开始
当我关闭应用程序并从通知打开它时,Activity B 启动。
所以,当我点击主页按钮时,应用程序导航到 Activity A。 然后,我按下“返回”按钮,应用程序进入后台,我进入 Android 主屏幕。
这没问题,但如果我打开最近的应用程序菜单并再次 select 我的应用程序,它会加载 Activity B 而不是我预期的 Activity A。我真的不知道发生了什么。
通知生成器中设置的意图是:
Intent intent = new Intent(this, ActivityB.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
在Activity B 我有:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (id == android.R.id.home) {
Intent intent = new Intent(ActivityB.this, ActivityA.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
有什么想法或建议吗?
您可以改用 FLAG_ACTIVITY_REORDER_TO_FRONT
标志,它只会对活动重新排序,而不是 FLAG_ACTIVITY_CLEAR_TOP
,后者会删除其上的其他活动。
例如,当使用 FLAG_ACTIVITY_REORDER_TO_FRONT
考虑一项由四个活动组成的任务:A, B, C, D
。如果 D
使用解析为 activity B 的组件的 Intent
调用 startActivity()
,则 B 将被带到历史堆栈的前面,结果顺序为: A, C, D, B
。如果还指定了 FLAG_ACTIVITY_CLEAR_TOP
,则此标志将被忽略。
你可以参考这个link:https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT
发生这种情况的原因是最近任务列表中的任务是从 Notification
以 ActivityB
作为根 Activity
开始的。如果您从最近任务列表中选择此任务,Android 会将现有任务置于前台。但是,如果任务中没有活动活动(所有活动都已完成),则 Android 会再次从该任务启动根 Activity
。
如果应用程序是从 Notification
启动的,您需要阻止该应用程序被添加到最近任务列表中。您可以通过添加:
android:excludeFromRecents="true"
到 ActivityB
的清单条目。
我找到了符合我预期的解决方案。 当我收到通知时,我创建了一个新的任务堆栈,我的 mainActivity 位于顶部:
Intent intent = new Intent(this, ActivityB.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(ActivityB.class);
stackBuilder.addNextIntent(intent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
现在,我还可以删除 Activity B:
中对主页按钮的覆盖检查// This can be now removed
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (id == android.R.id.home) {
Intent intent = new Intent(ActivityB.this, ActivityA.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}