title: activity的4种模式
date: 2019-08-27 16:04:41
tags:
activity的四种启动模式
通过修改AndroidManifest.xml中activity的launchMode来设置activity的启动模式
standard模式
每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。
这意味着从FirstActivity打开SecondActivity再打开FirstActivity的时候,返回栈中重复压入了FirstActivity。
// 在FirstActivity中设置按钮打开SecondActivity
Button btn = findViewById(R.id.btn_go_to_second_activity);
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
...
// 在SecondActivity中设置按钮打开SecondActivity
Button btn = findViewById(R.id.btn_go_to_main_activity);
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent(SecondActivity.this, MainActivity.class);
startActivity(intent);
}
});
先点击firstactivity按钮进入secondactivity,再点击secondactivity按钮回到firstactivity,log如下
2019-08-27 16:23:53.143 1970-1970/? D/MainActivity: onCreate: com.konka.demo.MainActivity@5435e1b
2019-08-27 16:24:02.101 1970-1970/com.konka.demo D/SecondActivity: onCreate: com.konka.demo.SecondActivity@717938d
2019-08-27 16:24:06.072 1970-1970/com.konka.demo D/MainActivity: onCreate: com.konka.demo.MainActivity@b760cf0
我们可以看到firstactivity被创建了两次。
singleTop模式
每当启动一个新的活动,系统会检查返回栈的栈顶,如果新的活动与栈顶活动相同,则直接使用它,不再创建新的活动。
比如,如果将FirstActivity中按钮改成
@Override
public void onClick(View view){
Intent intent = new Intent(MainActivity.this, MainActivity.class);
startActivity(intent);
}
也就是自己指向自己,如果使用的是standard模式启动,当我们点击按钮的时候,系统会不断创建FirstActivity,这无疑十分浪费系统资源。而使用singleTop模式启动,不论点按钮多少次,都不会有新的打印信息出现。
2019-08-27 16:48:53.779 3861-3861/com.konka.demo D/MainActivity: onCreate: com.konka.demo.MainActivity@5435e1b
singleTask模式
每次启动该活动的时候,系统首先检查栈中是否存在该活动的实例,并把这个活动之上的所有活动统统出栈,如果没有发现,就会创建一个新的活动实例。
我制作了好多个相似的页面,通过按钮能打开新的页面,打开的顺序如下:
FirstActivity -> SecondActivity -> ThirdActivity -> ForthActivity -> FifthActivity -> FirstActivity
Logcat中打印的信息如下:
2019-08-27 17:24:44.377 5853-5853/? D/MainActivity: onCreate: com.konka.demo.MainActivity@5435e1b
2019-08-27 17:24:48.379 5853-5853/com.konka.demo D/SecondActivity: onCreate: com.konka.demo.SecondActivity@717938d
2019-08-27 17:24:49.839 5853-5853/com.konka.demo D/ThirdActivity: onCreate: com.konka.demo.ThirdActivity@f5f2c25
2019-08-27 17:24:51.061 5853-5853/com.konka.demo D/ForthActivity: onCreate: com.konka.demo.ForthActivity@7316d67
2019-08-27 17:24:52.189 5853-5853/com.konka.demo D/FifthActivity: onCreate: com.konka.demo.FifthActivity@17d599
2019-08-27 17:24:53.774 5853-5853/com.konka.demo D/SecondActivity: onDestroy
2019-08-27 17:24:53.780 5853-5853/com.konka.demo D/ThirdActivity: onDestroy
2019-08-27 17:24:53.789 5853-5853/com.konka.demo D/ForthActivity: onDestroy
2019-08-27 17:24:53.808 5853-5853/com.konka.demo D/MainActivity: onRestart
2019-08-27 17:24:54.462 5853-5853/com.konka.demo D/FifthActivity: onDestroy
过程大概是下面这样的:
singleInstance模式
指定为singleInstance的活动,会启用一个新的返回栈来管理。假如程序中有一个活动是允许其它程序调用的,就可以使用这种模式。
在前面程序基础上,将SecondActivity/ThirdActivity/ForthActivity的launchMode改成singleInstance
回到FirstActivity后点击Back键直到程序退出
Log打印如下:
2019-08-27 18:03:14.902 6257-6257/com.konka.demo D/MainActivity: onCreate: com.konka.demo.MainActivity@5435e1b
2019-08-27 18:03:20.227 6257-6257/com.konka.demo D/SecondActivity: onCreate: com.konka.demo.SecondActivity@717938d
2019-08-27 18:03:23.483 6257-6257/com.konka.demo D/ThirdActivity: onCreate: com.konka.demo.ThirdActivity@f5f2c25
2019-08-27 18:03:27.288 6257-6257/com.konka.demo D/ForthActivity: onCreate: com.konka.demo.ForthActivity@7316d67
2019-08-27 18:03:29.791 6257-6257/com.konka.demo D/FifthActivity: onCreate: com.konka.demo.FifthActivity@17d599
2019-08-27 18:03:32.824 6257-6257/com.konka.demo D/MainActivity: onRestart
2019-08-27 18:03:33.267 6257-6257/com.konka.demo D/FifthActivity: onDestroy
2019-08-27 18:03:51.913 6257-6257/com.konka.demo D/ForthActivity: onRestart
2019-08-27 18:03:53.183 6257-6257/com.konka.demo D/MainActivity: onDestroy
2019-08-27 18:04:01.450 6257-6257/com.konka.demo D/ThirdActivity: onRestart
2019-08-27 18:04:02.241 6257-6257/com.konka.demo D/ForthActivity: onDestroy
2019-08-27 18:04:03.762 6257-6257/com.konka.demo D/SecondActivity: onRestart
2019-08-27 18:04:04.610 6257-6257/com.konka.demo D/ThirdActivity: onDestroy
2019-08-27 18:04:07.362 6257-6257/com.konka.demo D/SecondActivity: onDestroy
FirstActivity -> SecondActivity -> ThirdActivity -> ForthActivity -> FifthActivity -> FirstActivity
开始点击Back键:
-> ForthActivity -> ThirdActivity -> SecondActivity -> APP退出
singleInstance模式下启动活动,会启用一个新的返回栈,而singleTask模式下使用的栈是个临时栈。