【发布时间】:2014-11-27 00:21:31
【问题描述】:
我在 android 文档中读到 singleTop 模式是这样的:
如果活动的一个实例已经存在于顶部 当前任务,系统通过 调用它的 onNewIntent() 方法,而不是创建一个新实例 的活动。活动可以被实例化多次,每次 实例可以属于不同的任务,一个任务可以有多个 实例(但仅当返回堆栈顶部的活动是 不是活动的现有实例)。
但是,我的应用程序的行为有所不同。我的主要活动在清单文件中定义了 singleTop 启动模式。这就是它表现异常的地方。
- 从启动器启动主要活动。
- 从主活动,开始子活动。
- 当用户按下后退按钮(或操作栏主页按钮)时,它会向主 Activity 发送一些额外的意图。这意味着需要更新主活动(取决于子活动中的用户操作。)
- 主要活动显示更新后的显示。
-- 奇怪的是这个--
- 在主活动中,按下返回按钮会再次返回到主活动。
- 第二次按后退按钮会调出启动器屏幕,然后我的应用程序会进入后台。
在第 5 步,为什么它再次调出主要活动?我认为 singleTop 将把主要活动放在前面,这是任务中当前堆栈的顶部。但从 #5 和 #6 中的行为来看,它似乎是在创建两个 main Activity 实例。
是我的理解不正确还是发生了其他我不清楚的事情。请帮助解释/澄清。谢谢。
我的子活动覆盖了它的 onBackPressed 方法。同样,主要活动 onNewIntent() 处理额外内容。
@Override
public void onBackPressed() {
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra(MainActivity.UPDATE_ARG, true);
startActivity(intent);
super.onBackPressed();
}
注意:如果我使用 singleTask 模式,它的行为与我对 singleTop 的预期相同。但我在某处读到过要谨慎使用 singleTask 和 singleInstance。
【问题讨论】:
-
回压不会发送意图,它会完成顶部活动。这些不是一回事。
-
@Karakuri 我忘了提,我已经覆盖了子活动的 onBackpressed() 方法,并在那里为主要活动传递额外内容(如果需要)创建了一个新意图。