activity的四种启动模式


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

过程大概是下面这样的:

singleTask过程

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模式下使用的栈是个临时栈。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容