网上流传的信息:singleInstance适合需要与程序分离的页面,例如闹铃提醒,将闹铃提醒与闹铃设置分离,singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如;A->B(singleInstance)->C,完全退出后,再次启动,首先打开的是B.
google 了一下Activity 的启动模式,排名前几个的内容几乎是一模一样的,其他的没什么说的,但是这个 A->B->C 完全退出之后再次打开是B,让人很费解。想不明白为什么,启动app 不去找我设置的launchActivity而去打开别的,这不科学。
B 是singletask 模式,它自己一个栈,而且最后打开的是C,所以B 的任务栈将处于后台,退出有两种:一种是直接杀死进程,那么 前台后台任务栈都会被销毁,重新启动打开后是A;第二种是回退键,一个一个回退,C->A->B,再次打开之后仍然是A。
app 启动过程,手机开机的时候会读取所有应用程序的manifest,然后将manifest 的信息注册进系统里面,当你打开app 的时候会根据包名去匹配对应的app, 启动 标志为 launch 的activity,所以杀掉进程重启只能是A。
要想直接到B 只能是 退出C->A 不退出B,按home键 再回来,这跟"完全退出后,再次启动,首先打开的是B"的说法明显相差甚远!
但是作为中间件 B 是有问题的,因为回退的时候是C->A->B,这是不可接受的。
测试相关代码:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".BActivity"
android:launchMode="singleInstance" />
<activity android:name=".CActivity"></activity>
main->B->C
findViewById(R.id.tv_click).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, BActivity.class));
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
startActivity(new Intent(this, CActivity.class));
//finish() 无论是否调用finish 都是一个结果
}
测试:Android 7.0 魅族
结果:1.没出现 A->B(singleInstance )->C 完全退出之后 再打开程序直接到->B
2.singleInstance 不能作为中间件
3.Activity 的任务栈->别名:回退栈
以上是个人测试的结果:不知道那些流传很高的结果是怎么产生的