用代码理解Acticity启动模式

Posted jia-huan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用代码理解Acticity启动模式相关的知识,希望对你有一定的参考价值。

本章内容

  1. Activity 四种启动模式的理论知识
  2. 代码理解

Activity 四种启动模式的理论知识

standard

默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。

singleTop

当活动的启动模式指定为 singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例,如果不是在栈顶,那么就会再次创建一个实例.

singleTask

启动模式为singleTask的Activity的对象,在整个Activity栈中只会存在一个,并且如果再次启动,Activity栈会清空该实例上面的所有Activity对象,感觉有点抽象,第二部分会用代码清楚的表现出来的。

singleInstance

只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在,并且这会导致一些跳转上的逻辑问题,这个得处理好才行。


代码理解

代码准备

androidManifest.xml

 <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".A"
            android:launchMode="singleTop" />
        <activity
            android:name=".B"
            android:launchMode="singleInstance" />
        <activity
            android:name=".C"
            android:launchMode="singleTask"></activity>
    </application>

这里没有配置MainAcitivy的启动模式,那么它的启动模式就是默认的 standard了。
接下来所有Activity 的画面都是这种
这里写图片描述
每个Button对应着各自字母开头的Activity


先从简单的跳转、回退开始,每个按钮点三下

连点M,MainActivity–standard

05-21 11:47:21.654 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onPause
05-21 11:47:21.664 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onCreate
05-21 11:47:21.674 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onstart
05-21 11:47:21.674 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onResume
05-21 11:47:22.054 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onStop
05-21 11:47:22.934 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onPause
05-21 11:47:22.944 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onCreate
05-21 11:47:22.954 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onstart
05-21 11:47:22.954 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onResume
05-21 11:47:23.334 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onStop
05-21 11:47:24.494 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onPause
05-21 11:47:24.494 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onCreate
05-21 11:47:24.514 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onstart
05-21 11:47:24.514 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onResume
05-21 11:47:24.884 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onStop

因为我的MainActivity是LAUNCHER,所以才会有开头的 onpause,onstop,可以看到

05-21 11:47:21.664 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onCreate
05-21 11:47:21.674 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onstart
05-21 11:47:21.674 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onResume

这三个Log输出了三次,就是开启了3个MainActivity,Activity栈中已经存在了4个MainActivity,那么必然的退出时候,onDestroy会被执行四次

05-21 11:50:18.894 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onPause
05-21 11:50:18.904 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onRestart
05-21 11:50:18.904 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onstart
05-21 11:50:18.904 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onResume
05-21 11:50:19.284 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onStop
05-21 11:50:19.284 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onDestroy
05-21 11:50:24.514 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onPause
05-21 11:50:24.524 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onRestart
05-21 11:50:24.524 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onstart
05-21 11:50:24.524 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onResume
05-21 11:50:24.904 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onStop
05-21 11:50:24.904 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onDestroy
05-21 11:50:26.074 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onPause
05-21 11:50:26.084 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onRestart
05-21 11:50:26.084 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onstart
05-21 11:50:26.084 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onResume
05-21 11:50:26.454 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onStop
05-21 11:50:26.454 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onDestroy
05-21 11:50:27.564 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onPause
05-21 11:50:27.974 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onStop
05-21 11:50:27.974 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onDestroy

连点B,BActivity–singleInstance

05-21 11:53:44.224 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onPause
05-21 11:53:44.284 18600-18600/cjh.lauchmode D/tag-B--singleInstance: tag-B--singleInstance- onCreate
05-21 11:53:44.294 18600-18600/cjh.lauchmode D/tag-B--singleInstance: tag-B--singleInstance- onstart
05-21 11:53:44.294 18600-18600/cjh.lauchmode D/tag-B--singleInstance: tag-B--singleInstance- onResume
05-21 11:53:44.604 18600-18600/cjh.lauchmode D/tag-M--standard: tag-M--standard- onStop
05-21 11:53:46.884 18600-18600/cjh.lauchmode D/tag-B--singleInstance: tag-B--singleInstance- onPause
05-21 11:53:46.884 18600-18600/cjh.lauchmode D/tag-B--singleInstance: tag-B--singleInstance- onResume
05-21 11:53:47.864 18600-18600/cjh.lauchmode D/tag-B--singleInstance: tag-B--singleInstance- onPause
05-21 11:53:47.864 18600-18600/cjh.lauchmode D/tag-B--singleInstance: tag-B--singleInstance- onResume

正如理论说的那样,跳转BActivity所产生的栈,只会存在一个B的实例,在log输出中确实只输出了一次

05-21 11:53:44.284 18600-18600/cjh.lauchmode D/tag-B--singleInstance: tag-B--singleInstance- onCreate
05-21 11:53:44.294 18600-18600/cjh.lauchmode D/tag-B--singleInstance: tag-B--singleInstance- onstart

之后的输出就只有

05-21 11:53:47.864 18600-18600/cjh.lauchmode D/tag-B--singleInstance: tag-B--singleInstance- onPause
05-21 11:53:47.864 18600-18600/cjh.lauchmode D/tag-B--singleInstance: tag-B--singleInstance- onResume

之前说过,这个模式会导致跳转逻辑有些异常,这次点击的顺序是A-C-B-M

05-21 12:09:43.374 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onPause
05-21 12:09:43.374 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onCreate
05-21 12:09:43.384 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onstart
05-21 12:09:43.384 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onResume
05-21 12:09:43.784 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onStop
05-21 12:09:49.394 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onPause
05-21 12:09:49.414 28588-28588/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onCreate
05-21 12:09:49.424 28588-28588/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onstart
05-21 12:09:49.424 28588-28588/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onResume
05-21 12:09:49.814 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onStop
05-21 12:09:51.384 28588-28588/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onPause
05-21 12:09:51.434 28588-28588/cjh.lauchmode D/tag-B--singleInstance: tag-B--singleInstance- onCreate
05-21 12:09:51.444 28588-28588/cjh.lauchmode D/tag-B--singleInstance: tag-B--singleInstance- onstart
05-21 12:09:51.444 28588-28588/cjh.lauchmode D/tag-B--singleInstance: tag-B--singleInstance- onResume
05-21 12:09:51.734 28588-28588/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onStop
05-21 12:09:55.584 28588-28588/cjh.lauchmode D/tag-B--singleInstance: tag-B--singleInstance- onPause
05-21 12:09:55.594 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onCreate
05-21 12:09:55.604 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onstart
05-21 12:09:55.604 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onResume
05-21 12:09:55.994 28588-28588/cjh.lauchmode D/tag-B--singleInstance: tag-B--singleInstance- onStop

按照正常的逻辑,返回的顺序应该是M-C-B-A,但是实际上真正的顺序是M-C-A-B:

05-21 12:13:05.944 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onPause
05-21 12:13:05.954 28588-28588/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onRestart
05-21 12:13:05.954 28588-28588/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onstart
05-21 12:13:05.954 28588-28588/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onResume
05-21 12:13:06.344 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onStop
05-21 12:13:06.354 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onDestroy
05-21 12:13:06.924 28588-28588/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onPause
05-21 12:13:06.934 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onRestart
05-21 12:13:06.934 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onstart
05-21 12:13:06.934 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onResume
05-21 12:13:07.314 28588-28588/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onStop
05-21 12:13:07.314 28588-28588/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onDestroy
05-21 12:13:08.644 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onPause
05-21 12:13:08.654 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onRestart
05-21 12:13:08.654 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onstart
05-21 12:13:08.654 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onResume
05-21 12:13:09.034 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onStop
05-21 12:13:09.034 28588-28588/cjh.lauchmode D/tag-A--singleTop

以上是关于用代码理解Acticity启动模式的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用片段保存夜间模式状态

用于从 cloudkit 检索单列的代码模式/片段

金蝶handler中 collection 代码片段理解

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

如何理解这段代码片段中的两对括号?

精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解