我在android文档中读过singleTop模式是这样的:
如果活动的实例已存在于顶部 当前任务,系统通过a将意图路由到该实例 调用它的onNewIntent()方法,而不是创建一个新实例 活动。活动可以多次实例化 实例可以属于不同的任务,一个任务可以有多个任务 实例(但仅当后台堆栈顶部的活动是 不是活动的现有实例。)
但是,我的应用程序表现不同。我的主要活动是清单文件中定义的singleTop启动模式。这是奇怪的表现。
- 奇怪的是这个 -
在第5步,它为什么再次提出主要活动?我认为singleTop会将主要活动带到前面,这是当前任务中堆栈的顶部。但是从#5和#6中的那种行为来看,它似乎正在创建两个主要活动实例。
我的理解是不正确还是其他事情正在发生,我还不清楚。请帮助解释/澄清。感谢。
我的子活动已覆盖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要谨慎使用。
答案 0 :(得分:2)
来自发布的文档:
一个任务可以有多个实例(但只有当活动在 后堆栈的顶部不是活动的现有实例。
从你的代码:
当用户按下后退按钮(或操作栏主页按钮)时,它会发送 意图主要活动与一些额外的。这意味着主要 活动需要更新(取决于sub中的用户操作) 活性。)
当用户按下按钮时,您的主要活动剂量不存在于当前任务的顶部,并且您的子活动位于顶部,因为它尚未销毁,因此它创建了另一个主要活动,并且不使用现有活动,因为它主要活动不是最重要的。
从文档中查看此内容,请注意backstack
包含当前前台活动:
答案 1 :(得分:0)
为什么它会再次提出主要活动?
好吧,因为当你这样做时,你又开始了你的活动:
startActivity(intent);
您的活动中的任何更新都应该在onStart方法中执行(或者如果适用,则在onResume上执行)。
答案 2 :(得分:0)
我终于理解了这一切(我想!)。我会解释一下。
android:launchMode
属性适用于活动,无论是从家庭启动器,应用程序(或其他应用程序)启动的。
实现Intent.FLAG_ACTIVITY_CLEAR_TOP
行为需要意图标记singleTop
。因此,我在开始活动之前创建意图时传递了该标志。
对于主要活动,这就是我所做的:
@Override
public void onBackPressed() {
Intent intent = new Intent(this, MainActivity.class);
// these flags are important!!
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra(MainActivity.UPDATE_ARG, true);
startActivity(intent);
super.onBackPressed();
}
相应地,我在清单文件中声明了android:launchMode="singleTop"
。