Activity四种启动模式

Activity有四种启动模式:standard(默认)、singleTop、singleTask、singleInstance
通过AndroidManifest.xml中的activity的 android:launchMode=”—-“进行配置。

一、standard是默认的启动模式,不配置launchMode就是标准启动模式

每次startActivity的时候,都创建一个新的activity,依次放入任务栈
假如只有一个activity A,自己打开自己。
执行的操作,A1->A2->A3,
任务栈中依次也是A1->A2->A3,
点击返回按钮,依次销毁A3,A2,A1
Activity四种启动模式_第1张图片
如果在Activity中打印log,可以发现,standard模式在startActivity的时候,每次都执行了onCreate创建了新页面。

二、singleTop

single Top 可以理解为顶部是单一的Activity不能重复。
当一个activity B是singleTop模式在任务栈顶的时候,启动其他的activity A没问题,但是启动相同的activity B,并不会创建新的activity B,也就是 B ->startActivity ->B的时候,并不会再次执行activity的onCreate()方法。
Activity四种启动模式_第2张图片

但在此时会执行onNewIntent方法,在其中可以调用setIntent(intent) 更新页面的intent,否则的话,getIntent() 仍然得到的是第一次启动时候的值。

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);//更新getIntent()得到的数据
    }

操作举例:A 为标准模式,B为singleTop模式

例1、操作顺序: A->B->B->点击返回按钮->点击返回按钮
执行过程:
第一步A->B的记录:
A onCreate
A onStart
A onResume
A onPause
B onCreate
B onStart
B onResume
A onStop
第二步B->B的记录:
B onPause
B onNewIntent
B onResume
第三步 第一次点击返回按钮:
B onPause
A onRestart
A onStart
A onResume
B onStop
B onDestroy
第四步 第二次点击返回按钮:
A onPause
A onStop
A onDestroy
可以看出 B启动B的时候,并没有执行B onCreate,而是执行了B onNewIntent

例2、操作顺序: A->B->A->B->点击返回按钮四次
简单来说,log为开A->开B->开A->开B—>关B->关A->关B->关A
具体log不贴了,由于B没有在栈顶启动自己,每次的执行,都是正常的执行onCreate,没有执行onNewIntent。
栈里有四个activity实例,点击返回了四次,执行了各自页面的onDestroy。

三、singleTask

singleTask是说如果栈里面存在要启动页面B的实例,就不开启新的B实例了。会把任务栈里的在它上面的其他activity实例Destroy,这样,要启动的Activity B就会在栈顶了。
操作举例:三个页面,A,C为标准启动模式,B为singleTask模式
操作顺序:A1->B->C->A2->B->多次点击返回按钮
第一步A1->B :
A onCreate
B onCreate
B onStart
B onResume
第二步B->C:
B onPause
C onCreate
B onStop
第三步C->A2:
A onCreate
第四步A2->B:
C onDestroy
B onNewIntent
B onRestart
B onStart
B onResume
A onDestroy
这一步,先Destroy 栈顶A和要启动的Activity B之间的其他Activity C,启动B在栈顶执行onNewIntent等B页面的生命周期,最后Destroy 之前的栈顶A
相比较 singleTop执行onNewIntent后,singleTask比singleTop多执行了onRestart和onStart
第五步 点击返回一次
B onPause
B onStop
B onDestroy
第六步 点击返回第二次
A onDestroy
从此步可以看出,第四步B再次来到栈顶的时候,对栈里它下面的Activity A没有影响。
Activity四种启动模式_第3张图片

四、singleInstance

使用一个全新的任务栈Task来加载Activity 实例
1.如果目标Activity 的实例不存在,先创建一个新的Task栈,再创建目标Activity 实例,放在栈顶。
2.如果已经存在,无论位于哪个应用,哪个Task,都会把目标Activity所在的Task转到前台,并展示目标Activity


举例1:在同一个应用中,有A、B、C三个Activity,其中B为singleInstance模式

操作为A->B->C也就是 A打开B,B打开C
通过Android Studio的 Terminal命令查看 页面实例的Task ID
命令为 adb shell dumpsys activity activities
把打印出来的信息copy出来查找Task id

可以发现,A和C的Task ID相同,B的Task ID与A和C不同。
假设A的Task ID为1,A->B的时候,B的Task ID为2。
B->C的时候,C的Task ID为1,也就是B启动C的时候,把C放到A相同的Task ID为1的任务栈里面去了。

再进一步,在A->B->C的基础上->B
此时执行
B onNewIntent
B onRestart
B onStart
B onResume
并没有对不相同ID的A、C任务栈中的页面进行Destroy

对A->B->C进行点击返回按钮,依次关闭的页面为C、A、B
对A->B->C->B进行点击返回按钮,依次关闭的页面为B、C、A
由此也可以发现,任务栈也可以看成在 系统栈里面,显示在手机窗口的页面所在的Activity 任务栈 ,在系统的任务栈的栈顶

你可能感兴趣的:(Android)