Android Activity4种启动模式 —— 3分钟深刻理解
Posted 高、远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Activity4种启动模式 —— 3分钟深刻理解相关的知识,希望对你有一定的参考价值。
【1】总体认知
闲来直接看下表,了解下有哪4中启动模式。
启动模式 | 作用功能 |
---|---|
standard | 默认启动模式。没启动一个Activity就将这个activity入栈,系统不会考虑这个Activity是否在栈中,每次启动都是创建一个新的实例对象 |
singleTop | 启动Activity的时候,如果发现返回栈的栈顶已经是这个Activity,就直接启动这个Activity,而不是创建一个全新的实例。 |
singleTask | 启动Activity的时候,如果发现返回栈中已经存在这个Activity,就直接启动这个Activity,而不是创建一个全新的实例。并将这个Activity之上的所有其他Activity出栈。 |
singleInstance | 将这个Activity放到一个特殊的栈中管理,方便与其他应用程序共享这个Activity。 |
【2】standard
模式
standard是Activity的默认启动模式,在不进行显示指定的情况下,所有Activity都自动使用这种启动模式。android是使用返回栈管理Activity的,在Standard模式下,每当启动一个Activity,就将这个Activity入栈,每次使用到这个Activity的时候都是创建一个新的实例,而系统并不在乎栈中是否存在这个Activity。
演示理解:
点击跳转按钮,跳转到本Activity(为了演示),在新建该Activity的时候打印hash码:
点击三次结果如下
发现3次的hash码不一样,就证明确实每次点击的时候是新创建的Activity。
【3】singleTop
模式
条件 | 结果 |
---|---|
该Activity在栈顶 | 直接复用这个Activity,而不是重新创建 |
该Activity不在栈顶 | 当需要用到这个Activity的时候是重新创建一个新的实例 |
启动Activity时如果发现返回栈的栈顶已经是该Activity,则认为可以直接使用它,而不是新创建一个Activity实例。
演示:
① 指定Activity1是singleTop
② 其余代码不变,发现无论怎么点击,log都只打印一个,说明这个Activity并没有被重新建立。
如果不是在栈顶呢?
① 我们将activity1的点击事件设置为跳转到activity2,activity2几乎与activity1代码相同,将activity2的点击事件设置为跳转到activity1。
② activity1 跳转到 activity2 再由activity2 跳转到activity1。:
发现如果这个Activity不在栈顶,那么用这个Activity的时候还是会新建这个Activity实例,而不是直接使用
【4】singleTask
模式·
有没有办法让整个应用程序中只存在一个同一个ACtivity的实例呢?那就是使用singleTask模式。该模式每次启动Activity的时候,会在返回栈中检查是否存在该Activity的实例,如果没有就会创建一个新的实例,如果存在就会直接使用该Activity的实例,并把该Activity之上的其他所有Activity出栈。
演示:
① 将Activity1的启动模式设置为 singleTask
② 在Activity1 中添加onRestart方法
③ 在Activity2 中添加onDestroy方法:
结果:
从打印信息可以看出,Activity2启动Activity1时会发现返回栈中已经存在一个Activity1实例,于是Activity2直接出栈,Activity1成为了栈顶Activity。因此Activity1的onRestart和Activity2的onDestroy方法都会执行。
【5】singleInstance
模式
singleInstance模式的Activity会启动一个返回栈来管理这个Activity。想象一下:如果我们的程序中有一个Activity是允许其他应用程序调用的,如果想实现其他程序和我们的程序共享这个Activity实例,要如何实现呢?singleInstance解决这个问题,在这个模式下,有一个单独的返回栈管理这个Activity,不管哪个应用程序来访问这个Activity,都公用一个返回栈,也就解决了共享Activity实例的问题。
实验:
① 修改Activity2的模式
注意是Activity2。
② 然后修改Activity1中的代码:
③ 然后修改Activity2中的代码:
④最后修改Activity3中的代码:
结果:
可以看到Activity2的TaskId不同于Activity1和Activity3.这说明Activity2确实存放在一个单独的返回栈中,而且这个栈中只有Activity2这一个Activity。按一下返回键竟然直接返回到了Activity1,再按一下又返回到Activity2,再按下back才会退出程序。这是应为Activity1和Activity3存放在同一个返回栈中,Activity3返回时,Activity1就会成为栈顶显示在界面上,Activity1返回时当前所在的栈已经空了,显示另外一个返回栈的栈顶Activity,也就是Activity2。
以上就是Activity的4中启动模式及对比说明
文章根据《第一行代码——Android 》实现
以上是关于Android Activity4种启动模式 —— 3分钟深刻理解的主要内容,如果未能解决你的问题,请参考以下文章