一、启动模式简介
1. standard模式:每次启动都会创建一个新的实例
2.singleTop:被启动的activity处于栈顶时不会创建新实例。通俗理解为:只要哥在顶端,哥就是独一无二的,其它情况哥也没办法。
3.singleTask:只能有唯一一个实例,且会移除在它之上的activity。通谷理解为:哥是独一无二的,决不屈居于人下,在哥上面的都干掉,在我下面当小弟还是可以的。
4.singleInstance:在启动的时候,会开启一个新的BackStack,这个BackStack里只有一个Activity的实例存在。通谷理解为,哥是独一无二的,不愿与尔等同流合污,所以哥会单独弄一块地盘,不屈居人下,也不收小弟,都别来烦哥。
二、下面就来验证上面的结论
1. 首先送上测试代码,总共两个类:
(1)入口:MainActivity类
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("asd", "onCreate:" + getClass().getSimpleName() + " TaskId: " + getTaskId() + "--->hasCode:" + this.hashCode());
}
public void lanuchActivity(View view) {
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
Log.e("asd", "从"+getClass().getSimpleName()+"跳转到--->"+SecondActivity.class.getSimpleName());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d("asd", "onNewIntent:" + getClass().getSimpleName() + " TaskId: " + getTaskId() + "----> hasCode:" + this.hashCode());
}
}
(2)SecondActivity类public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Log.d("asd", "onCreate:" + getClass().getSimpleName() + " TaskId: " + getTaskId() + "---->hasCode:" + this.hashCode());
}
public void lanuchSecondActivity(View view){
Intent intent=new Intent(this,MainActivity.class);
startActivity(intent);
Log.e("asd", "从"+getClass().getSimpleName()+"跳转到--->"+MainActivity.class.getSimpleName());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d("asd", "onNewIntent:" + getClass().getSimpleName() + " TaskId: " + getTaskId() + "----->hasCode:" + this.hashCode());
}
}
2.下面来根据打印结果分析:(1)standard:将MainActivity与SecondActivity都设置为standard启动模式
结果分析:
a. 每次打印的taskId都是一样的,说明在同一个任务栈中;
b. 同一个activity实例的hasCode的值每次都不同,说明每次都创建了新的实例.
结果分析:
a. 每次打印的taskId都是一样的,说明在同一个任务中;
b. hasCode的值每次也相同,说明除了第一次进入MainActivity时创建了实例,后面两次都因MainActivity处于栈顶而没有创建新的实例,只调用了onNewIntent()方法。
(3)singleTask:将MainActivity与SecondActivity都设置为singleTask启动模式
结果分析:

a. 每次打印的taskId都是一样的,表示在同一个任务栈中;
b. 首先MainActivity-->SecondActivity这时两个acitivity实例都创建好了,注意MainActivity是在SecondActivity下面的,所以没有被移除;
c. 然后SecondActivity---->MainActivity 这时因为MainActivity实例已经有了(未被移除),所以不会再创建,同时因为SecondActivity实例在
MainActivity实例上面,所以SecondActivity这时已经被移除了,在下一步会得到验证。
d. 最后MainActivity-->SecondActivity,发现创建了一个新的SecondActivity实例,那是因为在上一步时,SecondActivity实例被移除了。
(4)singleInstance:将MainActivity与SecondActivity都设置为singleInstance启动模式
结果分析:
a. MainActivity与SecondActivity的taskId是不一样的,说明二者处在不同的任务栈中
b. 首次创建对应该的实例后,后面则不会再创建,只会走onNewIntent()方法