今天看啥  ›  专栏  ›  高、远

Android Activity4种启动模式 —— 3分钟深刻理解

高、远  · CSDN  ·  · 2020-01-01 00:00

【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 》实现




原文地址:访问原文地址
快照地址: 访问文章快照