Activity 四大启动模式,一篇文章就够了。

    xiaoxiao2022-07-03  136

    首先感谢 https://blog.csdn.net/mynameishuangshuai/article/details/51491074 提供的帮助。话不多说,直接进入正题。

    啰嗦一句,怎么声明,这个相信只要不是初学者,都是知道的,在 Activity 节点下使用 launchMode 属性,进行设置,如下:

    <activity android:name=".activity.SecondActivity" android:launchMode="standard" />

    1.  standard-默认模式、标准模式

    这个启动模式相信不用过多介绍了吧,也是大家最常用的默认的模式,每次打开一个 Activity,都会创建一个新的实例,不管这个实例是否存在,都要进行从 onCreate 到 onDestory 的变化。这个模式就不多说了,下一个。

    2.  singleTop-栈顶复用模式

    听名字,就知道,它能复用了,那么他到底在什么情况下会被复用,什么情况下又会新建呢,下面我们一一说明:

    创建三个 Activity,设置第三个为 singleTop 启动模式,先创建一个父类:

    abstract class BaseActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Log.i("WooYun", "*****onCreate()方法******") Log.i("WooYun", "onCreate:" + this.javaClass.simpleName + " TaskId: " + taskId + " hasCode:" + this.hashCode()) } override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) Log.i("WooYun", "*****onNewIntent()方法*****") Log.i("WooYun", "onNewIntent:" + this.javaClass.simpleName + " TaskId: " + taskId + " hasCode:" + this.hashCode()) dumpTaskAffinity() } override fun onDestroy() { super.onDestroy() Log.i("WooYun", "*****onDestroy()方法*****") Log.i("WooYun", "onDestroy:" + this.javaClass.simpleName + " TaskId: " + taskId + " hasCode:" + this.hashCode()) } // override fun onSaveInstanceState(outState: Bundle?) { // super.onSaveInstanceState(outState) // Log.i("WooYun", "*****onSaveInstanceState()方法*****") // Log.i("WooYun", "onNewIntent:" + this.javaClass.simpleName + " TaskId: " + taskId + " hasCode:" + this.hashCode()) // } fun dumpTaskAffinity() { var info: ActivityInfo = this.packageManager.getActivityInfo(componentName, PackageManager.GET_META_DATA) Log.i("WooYun", "taskAffinity:"+info.taskAffinity); } }

    之后每个子类都是一样的:

    class MainActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) tvContent.text = "第一屏" Log.i("aaaaaaaaaaaaaaaaaaaaa", "111111 onCreate") tvContent.setOnClickListener { startActivity(Intent(this@MainActivity, SecondActivity::class.java)) } } }

    (1)如果 Activity 在栈顶

    我们让 ThirdActivity 一直跳转到自己的界面,就像我们 APP 里边的个人主页一样,可以再里边点击自己或者其他人的名字查看自己活着他人的主页,然后我们依次退出我们的 APP。

    我们来看运行结果:

    05-22 14:58:46.622 28704-28704/? I/WooYun: *****onCreate()方法****** 05-22 14:58:46.623 28704-28704/? I/WooYun: onCreate:MainActivity TaskId: 614 hasCode:82780448 05-22 14:58:47.616 28704-28704/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 14:58:47.617 28704-28704/com.example.kotlin.main I/WooYun: onCreate:SecondActivity TaskId: 614 hasCode:224421726 05-22 14:58:48.223 28704-28704/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 14:58:48.223 28704-28704/com.example.kotlin.main I/WooYun: onCreate:ThirdActivity TaskId: 614 hasCode:175435012 05-22 14:58:49.318 28704-28704/com.example.kotlin.main I/WooYun: *****onNewIntent()方法***** 05-22 14:58:49.319 28704-28704/com.example.kotlin.main I/WooYun: onNewIntent:ThirdActivity TaskId: 614 hasCode:175435012 05-22 14:58:49.319 28704-28704/com.example.kotlin.main I/WooYun: taskAffinity:com.example.kotlin.main 05-22 14:59:00.117 28704-28704/com.example.kotlin.main I/WooYun: *****onNewIntent()方法***** 05-22 14:59:00.118 28704-28704/com.example.kotlin.main I/WooYun: onNewIntent:ThirdActivity TaskId: 614 hasCode:175435012 05-22 14:59:00.119 28704-28704/com.example.kotlin.main I/WooYun: taskAffinity:com.example.kotlin.main

    我们发现,在 ThirdActivity 创建之后,再次进入 ThirdActivity,运行的是 onNewIntent 方法,而不是 onCreate 方法,这是因为在当前栈中已经存在 ThirdActivity 的实例,并且该实例在栈顶(为什么要强调下 ThirdActivity 在栈顶,下边会解释),ThirdActivity 就会一直使用栈中的实例,所以这时候的生命周期的运行就变成了,onNewIntent -> onReStart -> onStart -> ...再看我们推出 APP 的运行结果:

    05-22 14:59:00.117 28704-28704/com.example.kotlin.main I/WooYun: *****onNewIntent()方法***** 05-22 14:59:00.118 28704-28704/com.example.kotlin.main I/WooYun: onNewIntent:ThirdActivity TaskId: 614 hasCode:175435012 05-22 14:59:00.119 28704-28704/com.example.kotlin.main I/WooYun: taskAffinity:com.example.kotlin.main 05-22 14:59:03.969 28704-28704/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 14:59:03.970 28704-28704/com.example.kotlin.main I/WooYun: onDestroy:ThirdActivity TaskId: 614 hasCode:175435012 05-22 14:59:04.865 28704-28704/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 14:59:04.866 28704-28704/com.example.kotlin.main I/WooYun: onDestroy:SecondActivity TaskId: 614 hasCode:224421726 05-22 14:59:06.338 28704-28704/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 14:59:06.339 28704-28704/com.example.kotlin.main I/WooYun: onDestroy:MainActivity TaskId: 614 hasCode:82780448

    我们发现 ThirdActivity 只执行了一次 onDestory,这也说明了该模式的用处,如果 ThirdActivity 在栈顶,会一直复用栈中的实例,

    (2)如果 Activity 不在栈顶

    同样我们使用上边的例子,把 Activity 增加到五个,让 FiveActivity 调转到 ThirdActivity,我们来看下结果:

    05-22 15:20:17.236 30376-30376/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 15:20:17.237 30376-30376/com.example.kotlin.main I/WooYun: onCreate:MainActivity TaskId: 619 hasCode:176035816 05-22 15:20:18.900 30376-30376/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 15:20:18.901 30376-30376/com.example.kotlin.main I/WooYun: onCreate:SecondActivity TaskId: 619 hasCode:185895705 05-22 15:20:19.735 30376-30376/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 15:20:19.736 30376-30376/com.example.kotlin.main I/WooYun: onCreate:ThirdActivity TaskId: 619 hasCode:118375958 05-22 15:20:21.018 30376-30376/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 15:20:21.019 30376-30376/com.example.kotlin.main I/WooYun: onCreate:FourActivity TaskId: 619 hasCode:115493244 05-22 15:20:22.821 30376-30376/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 15:20:22.821 30376-30376/com.example.kotlin.main I/WooYun: onCreate:FiveActivity TaskId: 619 hasCode:96689635 05-22 15:20:27.199 30376-30376/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 15:20:27.200 30376-30376/com.example.kotlin.main I/WooYun: onCreate:ThirdActivity TaskId: 619 hasCode:259725656

    这时候你会惊奇的发现,咦?这不是栈顶复用模式吗,为什么 ThirdActivity 会执行 onCreate?说,你是不是偷偷的改成了 startand 模式,天地良心啊,我绝对没改,这也正是要说的,如果 ThirdActivity 不在栈顶,那么它就会和 startand 模式一样,不管是否存在实例,都会新建一个实例,当然,这时候既然存在一个新的实例了,那么依次退出我们的 Activity,也是一个一个的出栈,运行结果也证明了我们说的实话没有问题的。

    05-22 15:24:48.432 30376-30376/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 15:24:48.433 30376-30376/com.example.kotlin.main I/WooYun: onDestroy:ThirdActivity TaskId: 619 hasCode:170193900 05-22 15:24:49.006 30376-30376/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 15:24:49.007 30376-30376/com.example.kotlin.main I/WooYun: onDestroy:FiveActivity TaskId: 619 hasCode:247995335 05-22 15:24:49.598 30376-30376/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 15:24:49.598 30376-30376/com.example.kotlin.main I/WooYun: onDestroy:FourActivity TaskId: 619 hasCode:236528846 05-22 15:24:50.122 30376-30376/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 15:24:50.122 30376-30376/com.example.kotlin.main I/WooYun: onDestroy:ThirdActivity TaskId: 619 hasCode:259725656 05-22 15:24:50.679 30376-30376/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 15:24:50.680 30376-30376/com.example.kotlin.main I/WooYun: onDestroy:FiveActivity TaskId: 619 hasCode:96689635 05-22 15:24:51.271 30376-30376/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 15:24:51.271 30376-30376/com.example.kotlin.main I/WooYun: onDestroy:FourActivity TaskId: 619 hasCode:115493244 05-22 15:24:51.828 30376-30376/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 15:24:51.829 30376-30376/com.example.kotlin.main I/WooYun: onDestroy:ThirdActivity TaskId: 619 hasCode:118375958 05-22 15:24:52.504 30376-30376/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 15:24:52.505 30376-30376/com.example.kotlin.main I/WooYun: onDestroy:SecondActivity TaskId: 619 hasCode:185895705 05-22 15:24:53.353 30376-30376/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 15:24:53.353 30376-30376/com.example.kotlin.main I/WooYun: onDestroy:MainActivity TaskId: 619 hasCode:176035816

    我们来总结下这个模式,要分三种情况来说明:

    (1)栈中不存在 Activity 实例,那么直接创建 Activity 实例。

    (2)栈中存在 Activity 实例,但是不在栈顶,那么和 startand 模式一样,依然会创建 Activity 实例。

    (3)栈中存在 Activity 实例,并且 Activity 在栈顶,会直接复用栈中的实例,并且执行 onNewIntent 方法。不会执行 onCreate 方法。

    3.  singleTask 模式-栈内复用模式

    先啰嗦一句吧,taskAffinity 可以声明一个栈,声明方式如下,如果不声明的话,使用的为默认的栈,一般为包名,有兴趣的可以自己研究下,声明任务战之后的变化情况,这里就不过多介绍了:

    <activity android:name=".activity.ThirdActivity" android:launchMode="singleTop" android:taskAffinity="com.example.kotlin.main"/>

    这个模式比较复杂,因为它涉及到了数据结构的知识,因为我上大学的时候,数据结构基本就没听过课,所以看这个模式有点懵逼,为了弄明白这个模式的运行过程,还和别人吵了一架,没办法,有些人总以为源码什么都能告诉你,但是我能跟你说的是,这个源码是不可能告诉你的,这也是我写这篇博客的重中之重。

    好了,我们来看代码吧,同样使用上边的例子,有五个 Activity,然后我们设置 FourActivity 的启动模式为 singleTask,我们来看下运行到 FiveActivity,然后我们让 FiveActivity 跳转到 MainActivity 的时候,我们的 Activity 栈中有哪些 Activity。我们来执行 adb shell dumpsys activity activities:

    TaskRecord{c959829 #621 A=com.example.kotlin.main U=0 sz=8} Run #8: ActivityRecord{485bf1 u0 com.example.kotlin.main/.activity.ThirdActivity t621} Run #7: ActivityRecord{3ddecac u0 com.example.kotlin.main/.activity.SecondActivity t621} Run #6: ActivityRecord{7584103 u0 com.example.kotlin.main/.activity.MainActivity t621} Run #5: ActivityRecord{c1ec526 u0 com.example.kotlin.main/.activity.FiveActivity t621} Run #4: ActivityRecord{e6c2905 u0 com.example.kotlin.main/.activity.FourActivity t621} Run #3: ActivityRecord{ae7eb50 u0 com.example.kotlin.main/.activity.ThirdActivity t621} Run #2: ActivityRecord{37528a2 u0 com.example.kotlin.main/.activity.SecondActivity t621} Run #1: ActivityRecord{fe3e142 u0 com.example.kotlin.main/.activity.MainActivity t621}

    然后我们再从 ThirdActivity 跳转到 FourActivity,因为我们设置了 FourActivity 的启动模式为 singleTask,来看下结果:

    Running activities (most recent first): TaskRecord{c959829 #621 A=com.example.kotlin.main U=0 sz=5} Run #4: ActivityRecord{e6c2905 u0 com.example.kotlin.main/.activity.FourActivity t621} Run #3: ActivityRecord{ae7eb50 u0 com.example.kotlin.main/.activity.ThirdActivity t621} Run #2: ActivityRecord{37528a2 u0 com.example.kotlin.main/.activity.SecondActivity t621} Run #1: ActivityRecord{fe3e142 u0 com.example.kotlin.main/.activity.MainActivity t621}

    咦?明明多跳转了两个 Activity,而栈中的 Activity 数量反而减少了,这是为什么呢?其实呢,这也正是这个模式的独特之处了,在这个模式下,如果 Activity 栈中存在 Activity 的实例,那么它会直接复用它的实例,并且它上边的 Activity 全部出栈。

    你以为这就完了?不要这么乐观,不然我也不会跟别人吵架了,我既然说了有数据结构的知识,那么就一定会说的。我们现在知道栈中只有五个实例了,但是别忘了,我们我跳转了十次 Activity 啊,那么剩下的那些 Activity 出栈顺序是什么,你知道吗?我们来看下它们的生命周期怎么执行的:

    05-22 15:50:41.073 919-919/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 15:50:41.075 919-919/com.example.kotlin.main I/WooYun: onCreate:MainActivity TaskId: 621 hasCode:78187225 05-22 15:50:46.199 919-919/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 15:50:46.201 919-919/com.example.kotlin.main I/WooYun: onCreate:SecondActivity TaskId: 621 hasCode:224421726 05-22 15:50:46.825 919-919/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 15:50:46.826 919-919/com.example.kotlin.main I/WooYun: onCreate:ThirdActivity TaskId: 621 hasCode:175435012 05-22 15:50:47.375 919-919/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 15:50:47.376 919-919/com.example.kotlin.main I/WooYun: onCreate:FourActivity TaskId: 621 hasCode:235554024 05-22 15:50:47.995 919-919/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 15:50:47.996 919-919/com.example.kotlin.main I/WooYun: onCreate:FiveActivity TaskId: 621 hasCode:128949470 05-22 15:50:48.632 919-919/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 15:50:48.632 919-919/com.example.kotlin.main I/WooYun: onCreate:MainActivity TaskId: 621 hasCode:212454551 05-22 15:50:49.566 919-919/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 15:50:49.568 919-919/com.example.kotlin.main I/WooYun: onCreate:SecondActivity TaskId: 621 hasCode:224372348 05-22 15:50:50.169 919-919/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 15:50:50.170 919-919/com.example.kotlin.main I/WooYun: onCreate:ThirdActivity TaskId: 621 hasCode:131499677 05-22 15:53:02.614 919-919/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 15:53:02.614 919-919/com.example.kotlin.main I/WooYun: onDestroy:FiveActivity TaskId: 621 hasCode:128949470 05-22 15:53:02.619 919-919/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 15:53:02.619 919-919/com.example.kotlin.main I/WooYun: onDestroy:MainActivity TaskId: 621 hasCode:212454551 05-22 15:53:02.623 919-919/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 15:53:02.623 919-919/com.example.kotlin.main I/WooYun: onDestroy:SecondActivity TaskId: 621 hasCode:224372348 05-22 15:53:02.635 919-919/com.example.kotlin.main I/WooYun: *****onNewIntent()方法***** 05-22 15:53:02.636 919-919/com.example.kotlin.main I/WooYun: onNewIntent:FourActivity TaskId: 621 hasCode:235554024 05-22 15:53:02.636 919-919/com.example.kotlin.main I/WooYun: taskAffinity:com.example.kotlin.main 05-22 15:53:02.937 919-919/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 15:53:02.938 919-919/com.example.kotlin.main I/WooYun: onDestroy:ThirdActivity TaskId: 621 hasCode:131499677

    而主要的也就是这一次的运行结果:

    05-22 15:50:50.169 919-919/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 15:50:50.170 919-919/com.example.kotlin.main I/WooYun: onCreate:ThirdActivity TaskId: 621 hasCode:131499677 05-22 15:53:02.614 919-919/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 15:53:02.614 919-919/com.example.kotlin.main I/WooYun: onDestroy:FiveActivity TaskId: 621 hasCode:128949470 05-22 15:53:02.619 919-919/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 15:53:02.619 919-919/com.example.kotlin.main I/WooYun: onDestroy:MainActivity TaskId: 621 hasCode:212454551 05-22 15:53:02.623 919-919/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 15:53:02.623 919-919/com.example.kotlin.main I/WooYun: onDestroy:SecondActivity TaskId: 621 hasCode:224372348 05-22 15:53:02.635 919-919/com.example.kotlin.main I/WooYun: *****onNewIntent()方法***** 05-22 15:53:02.636 919-919/com.example.kotlin.main I/WooYun: onNewIntent:FourActivity TaskId: 621 hasCode:235554024 05-22 15:53:02.636 919-919/com.example.kotlin.main I/WooYun: taskAffinity:com.example.kotlin.main 05-22 15:53:02.937 919-919/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 15:53:02.938 919-919/com.example.kotlin.main I/WooYun: onDestroy:ThirdActivity TaskId: 621 hasCode:131499677

    首先,ThirdActivity 入栈,然后 FourActivity 入栈,这时候神奇的事情发生了,FiveActivity、MainActivity、SecondActivity 分别出栈,然后执行 FourActivity 的 onNewIntent 方法,之后 ThirdActivity 才出栈,那么这时候或许就有人问了,跳转到 FourActivity 的时候,FourActivity 是复用了栈中存在的实例,那么 ThirdActivity 应该在栈顶啊,为什么先出栈的是 FiveActivity?这就是我要说的了,这里涉及到一个弹栈的知识,这里不过多讲解,感兴趣的可以自行查看,当跳转到 FourActivity 的时候,会复用存在的实例,把 FourActivity 放到栈顶,这时候指针上移,先找到的是 FiveActivity,然后是 MainActivity,之后是 SecondActivity,最后才是 ThirdActivity,并不是遵循先进后出的原则,谁在栈顶,谁先出栈。至于为什么先执行了 FourActivity 的 onNewIntent,然后 ThirdActivity 才出栈,就需要你们自己去理解 Activity 启动过程了、

    4. singleInstance-全局唯一模式

    这个模式比较好理解,栈内唯一模式,也叫单例模式,在一个栈中是唯一的,后续的请求都不会新建 Activity 实例,只会回调 onNewIntent 方法,当然它也要分两种情况说明下。

    (1)如果不在栈顶

    如果当前栈中的 Activity 在栈顶,我们来看它们退出的时候是怎么执行的生命周期,同样使用上边五个 Activity 的例子,我们设置 ThirdActivity 和 FourActivity 的模式为 singleInstance,运行结果如下:

    05-22 16:25:44.849 4863-4863/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 16:25:44.851 4863-4863/com.example.kotlin.main I/WooYun: onCreate:MainActivity TaskId: 622 hasCode:78187225 05-22 16:25:48.222 4863-4863/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 16:25:48.223 4863-4863/com.example.kotlin.main I/WooYun: onCreate:SecondActivity TaskId: 622 hasCode:224421726 05-22 16:25:48.839 4863-4863/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 16:25:48.840 4863-4863/com.example.kotlin.main I/WooYun: onCreate:ThirdActivity TaskId: 623 hasCode:175435012 05-22 16:25:49.779 4863-4863/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 16:25:49.780 4863-4863/com.example.kotlin.main I/WooYun: onCreate:FourActivity TaskId: 624 hasCode:235554024 05-22 16:25:50.522 4863-4863/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 16:25:50.523 4863-4863/com.example.kotlin.main I/WooYun: onCreate:FiveActivity TaskId: 622 hasCode:128949470 05-22 16:25:56.698 4863-4863/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 16:25:56.699 4863-4863/com.example.kotlin.main I/WooYun: onDestroy:FiveActivity TaskId: 622 hasCode:128949470 05-22 16:25:57.509 4863-4863/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 16:25:57.510 4863-4863/com.example.kotlin.main I/WooYun: onDestroy:SecondActivity TaskId: 622 hasCode:224421726 05-22 16:25:58.472 4863-4863/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 16:25:58.473 4863-4863/com.example.kotlin.main I/WooYun: onDestroy:MainActivity TaskId: 622 hasCode:78187225 05-22 16:25:59.233 4863-4863/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 16:25:59.233 4863-4863/com.example.kotlin.main I/WooYun: onDestroy:FourActivity TaskId: 624 hasCode:235554024 05-22 16:26:00.250 4863-4863/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 16:26:00.251 4863-4863/com.example.kotlin.main I/WooYun: onDestroy:ThirdActivity TaskId: 623 hasCode:175435012

    我们发现如果设置了 singleInstance 模式的 Activity 不在栈顶,那么在依次退出的时候,是不在该栈中的 Activity 先退出,然后该栈中的 Activity 才退出。

    (2)如果在栈顶

    既然设置了 singleInstance 模式的 Activity 不在栈顶,那么在依次退出的时候,是不在该栈中的 Activity 先退出,然后该栈中的 Activity 才退出,那么可想而知,如果在栈顶的情况,肯定是现退出了,我们来看运行结果:

    05-22 16:29:51.499 4863-4863/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 16:29:51.501 4863-4863/com.example.kotlin.main I/WooYun: onCreate:MainActivity TaskId: 628 hasCode:262035027 05-22 16:29:52.195 4863-4863/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 16:29:52.196 4863-4863/com.example.kotlin.main I/WooYun: onCreate:SecondActivity TaskId: 628 hasCode:188598677 05-22 16:29:52.831 4863-4863/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 16:29:52.832 4863-4863/com.example.kotlin.main I/WooYun: onCreate:ThirdActivity TaskId: 629 hasCode:135122018 05-22 16:29:53.728 4863-4863/com.example.kotlin.main I/WooYun: *****onCreate()方法****** 05-22 16:29:53.729 4863-4863/com.example.kotlin.main I/WooYun: onCreate:FourActivity TaskId: 630 hasCode:251649099 05-22 16:29:55.984 4863-4863/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 16:29:55.985 4863-4863/com.example.kotlin.main I/WooYun: onDestroy:FourActivity TaskId: 630 hasCode:251649099 05-22 16:29:57.184 4863-4863/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 16:29:57.185 4863-4863/com.example.kotlin.main I/WooYun: onDestroy:ThirdActivity TaskId: 629 hasCode:135122018 05-22 16:29:57.843 4863-4863/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 16:29:57.844 4863-4863/com.example.kotlin.main I/WooYun: onDestroy:SecondActivity TaskId: 628 hasCode:188598677 05-22 16:29:58.776 4863-4863/com.example.kotlin.main I/WooYun: *****onDestroy()方法***** 05-22 16:29:58.777 4863-4863/com.example.kotlin.main I/WooYun: onDestroy:MainActivity TaskId: 628 hasCode:262035027

    显然,我们的猜测是没有错的,

    这里说一下,如果一个 Activity 设置了该模式,并且声明了 taskAffinity,那么如果在另一个 APP 中,我们再次时候用这个 Activity,并且声明的 taskAffinity 是一样的,那么系统默认为是同一个 Activity 栈,这时候并不会创建 Activity 的实例,而是直接调用 onNewIntent 方法。

     

    最新回复(0)