活动的启动模式 第1篇
使用singleTop 模式可以很好地解决重复创建栈顶活动的问题。
但如果该活动并没有处于栈顶的位置,还是可能会创建多个活动实例的。
那么有没有什么办法可以让某个活动在整个应用程序的上下文中只存在一个实例呢?
借助singleTask模式。当活动的启动模式指定为singleTask, 每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
修改中FirstActivity 的启动模式,如下:
然后在FirstActivity中添加onRestart()方法,并打印日志:
最后在SecondActivity中添加onDestroy()方法,并打印日志:
从打印信息中可以明显看出了,在SecondActivity中启动FirstActivity 时,会发现返回栈中已经存在一个FirstActivity的实例,并且是在SecondActivity的下面,于是SecondActivity会从返回栈中出栈,而FirstActivity重新成为了栈顶活动,因此FirstActivity的onRestart()方法和SecondActivity的onDestroy( )方法会得到执行。现在返回栈中应该只剩下一个FirstActivity的实例了,按一下Back键就可以退出程序。
singleTask模式的原理示意图,如下所示:
活动的启动模式 第2篇
本文部分内容参考了郭神的《第一行代码》
活动的启动模式一般在中定义标签android:launchMode=_ _ 接下来开始具体介绍这四个启动模式的区别以及用途 standard singleInstance singleTop singleTask
说到这,我们先来看看返回栈是个什么呢?
原文是这样的:Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈被称为返回栈(Back Stack)。 理解:现在我们有一堆活动,activity(简称a),a1,a2,a3,a4,…,an,然后把这些活动都存在返回栈中.最先入栈的a1就在栈底,最后入栈的an就在栈顶,那么这些活动每次工作时,就会出栈入栈,整个流程如下图:
说实在的,我还是觉得上图有点点抽象,再来张新图理解一下子。
活动的启动模式 第3篇
栈内复用中还有一点要注意,栈内复用模式会将该实例上边的 Activity 全部出栈,将该实例置于栈顶。
单例模式,顾名思义,就是新开一个任务栈,该栈内只存放当前实例。比如说项目中语音通话功能,来电显示页面采用的就可以采用单例模式进行处理。
当然还有别的方法来新开任务栈,比如说启动 Activity 的时候加上 FLAG_ACTIVITY_NEW_TASK ,也会开启一个新的任务栈。
在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实例的问题。
例如:目前有三个活动,指定活动2为singleinstance,此时通过活动一跳转到活动二再跳转到活动三。在活动三界面按下Back,就回到了活动一、这时再按下Back才回到活动二。
这个和上面所说的singleInstance
基本一致,只不过会为启动的 Activity 新建任务栈。
在当前包下新建一个java类名叫BaseActivity,这个类继承AppCompatActivity类。然后让这个包下其他的Activity继承这个类BaseActivity。
在这个类中重新实现OnCreate方法,并且打印类名。
新建一个java类ActivityCollertor
在 Android 的 Activity
类中,有一个名为 isFinishing()
的方法,它用于检查当前 Activity
是否在即将被销毁的过程中。当一个 Activity
被调用了 finish()
方法后,它会进入“正在关闭”状态,表示它即将被销毁。在此状态下,isFinishing()
方法会返回 true
。
接下来修改上一个java类BaseActivity的代码
接下来只要你想销毁都可以调用()
方法即可。例如给一个button按钮使用该方法。
例如我们使用向上传递数据时,可以对消息进行封装:
调用起来非常方便一行代码即可,避免代码的复杂性,提高代码的可读性。
活动的启动模式 第4篇
并且launchMode=“singleTask”
当活动的启动模式指定为singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
如果当前返回栈中存在,不管是在栈的什么位置,都不会新建,会把它上面的全部出栈,它直接显示在栈顶。
我们给第一个Activity加上这两个语句:
给跳转的第二个Activity加上这个语句: