用代码理解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: tag-A--singleTop- onDestroy
05-21 12:13:10.284 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onPause
05-21 12:13:10.294 28588-28588/cjh.lauchmode D/tag-B--singleInstance: tag-B--singleInstance- onRestart
05-21 12:13:10.294 28588-28588/cjh.lauchmode D/tag-B--singleInstance: tag-B--singleInstance- onstart
05-21 12:13:10.294 28588-28588/cjh.lauchmode D/tag-B--singleInstance: tag-B--singleInstance- onResume

最后看到的才是B,这个是因为在跳转B之后,又跳转了一次M:

singleInstance启动了另一个栈,也就是说现在有两个栈,第一个栈从上到下是:M-C-A。另一个栈就是B一个实例,最后一次跳M的操作,让我们从B栈回到了第一个栈,那么接下来不断的返回,看到的也会是第一个栈中的Activity了,顺序是 M-C-A,第一个栈清理完了,接下来才会看到B栈。

连点A, AActivity–singleTop,对于A这里会做不一样的操作,先点一下A,在点一下M,最后点两下A

05-21 12:00:30.704 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onPause
05-21 12:00:30.714 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onCreate
05-21 12:00:30.724 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onstart
05-21 12:00:30.724 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onResume
05-21 12:00:31.104 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onStop
05-21 12:00:32.314 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onPause
05-21 12:00:32.324 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onCreate
05-21 12:00:32.334 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onstart
05-21 12:00:32.334 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onResume
05-21 12:00:32.704 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onStop
05-21 12:00:33.924 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onPause
05-21 12:00:33.934 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onCreate
05-21 12:00:33.944 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onstart
05-21 12:00:33.944 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onResume
05-21 12:00:34.334 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onStop
05-21 12:00:35.264 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onPause
05-21 12:00:35.264 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onResume

可以看到log中当第二次点击A这个Button的时候,发现AActivity不再栈顶,那么就会重新创建一次,第三次点击发现在栈顶,就只会调用onResume这个方法了,最后的栈中从上到下的顺序就是 A-M-A-M,所以退出的时候,整个log中onDestroy的方法只会被调用4次

05-21 12:04:54.604 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onPause
05-21 12:04:54.614 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onRestart
05-21 12:04:54.614 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onstart
05-21 12:04:54.614 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onResume
05-21 12:04:55.004 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onStop
05-21 12:04:55.004 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onDestroy
05-21 12:04:56.964 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onPause
05-21 12:04:56.974 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onRestart
05-21 12:04:56.974 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onstart
05-21 12:04:56.974 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onResume
05-21 12:04:57.354 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onStop
05-21 12:04:57.354 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onDestroy
05-21 12:04:58.294 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onPause
05-21 12:04:58.304 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onRestart
05-21 12:04:58.304 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onstart
05-21 12:04:58.304 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onResume
05-21 12:04:58.684 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onStop
05-21 12:04:58.684 28588-28588/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onDestroy
05-21 12:04:59.554 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onPause
05-21 12:04:59.984 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onStop
05-21 12:04:59.984 28588-28588/cjh.lauchmode D/tag-M--standard: tag-M--standard- onDestroy

连点C,CActivity–singleTask,singleTask其实是非常极端的一种模式,它会清空压在它所在栈上面所有压在的Activity实例,这里我们不跳B,无论C怎么强横也不可能去影响到别的栈,那么这次这么跳:A-C-C-M-A-C

05-21 12:21:54.864 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onCreate
05-21 12:21:54.874 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onstart
05-21 12:21:54.874 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onResume
05-21 12:21:55.254 21834-21834/cjh.lauchmode D/tag-M--standard: tag-M--standard- onStop
05-21 12:21:56.884 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onPause
05-21 12:21:56.934 21834-21834/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onCreate
05-21 12:21:56.944 21834-21834/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onstart
05-21 12:21:56.944 21834-21834/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onResume
05-21 12:21:57.334 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onStop
05-21 12:21:58.624 21834-21834/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onPause
05-21 12:21:58.624 21834-21834/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onResume
05-21 12:22:00.634 21834-21834/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onPause
05-21 12:22:00.634 21834-21834/cjh.lauchmode D/tag-M--standard: tag-M--standard- onCreate
05-21 12:22:00.644 21834-21834/cjh.lauchmode D/tag-M--standard: tag-M--standard- onstart
05-21 12:22:00.644 21834-21834/cjh.lauchmode D/tag-M--standard: tag-M--standard- onResume
05-21 12:22:01.024 21834-21834/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onStop
05-21 12:22:03.374 21834-21834/cjh.lauchmode D/tag-M--standard: tag-M--standard- onPause
05-21 12:22:03.394 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onCreate
05-21 12:22:03.404 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onstart
05-21 12:22:03.404 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onResume
05-21 12:22:03.804 21834-21834/cjh.lauchmode D/tag-M--standard: tag-M--standard- onStop
05-21 12:22:08.194 21834-21834/cjh.lauchmode D/tag-M--standard: tag-M--standard- onDestroy
05-21 12:22:08.194 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onPause
05-21 12:22:08.214 21834-21834/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onRestart
05-21 12:22:08.214 21834-21834/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onstart
05-21 12:22:08.214 21834-21834/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onResume
05-21 12:22:08.584 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onStop
05-21 12:22:08.584 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onDestroy

从最后的log中可以看到,当我最后一次跳C的时候,栈中有一个A和M已经被销毁了

05-21 12:22:03.804 21834-21834/cjh.lauchmode D/tag-M--standard: tag-M--standard- onStop
05-21 12:22:08.194 21834-21834/cjh.lauchmode D/tag-M--standard: tag-M--standard- onDestroy
05-21 12:22:08.194 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onPause
05-21 12:22:08.214 21834-21834/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onRestart
05-21 12:22:08.214 21834-21834/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onstart
05-21 12:22:08.214 21834-21834/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onResume
05-21 12:22:08.584 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onStop
05-21 12:22:08.584 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onDestroy

这里被销毁的A和M其实就是压在C上的Acticity的实例,回退就更加直观了

05-21 12:24:41.364 21834-21834/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onPause
05-21 12:24:41.374 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onRestart
05-21 12:24:41.374 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onstart
05-21 12:24:41.374 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onResume
05-21 12:24:41.754 21834-21834/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onStop
05-21 12:24:41.754 21834-21834/cjh.lauchmode D/tag-C--singleTask: tag-C--singleTask- onDestroy
05-21 12:24:42.274 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onPause
05-21 12:24:42.284 21834-21834/cjh.lauchmode D/tag-M--standard: tag-M--standard- onRestart
05-21 12:24:42.284 21834-21834/cjh.lauchmode D/tag-M--standard: tag-M--standard- onstart
05-21 12:24:42.284 21834-21834/cjh.lauchmode D/tag-M--standard: tag-M--standard- onResume
05-21 12:24:42.654 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onStop
05-21 12:24:42.654 21834-21834/cjh.lauchmode D/tag-A--singleTop: tag-A--singleTop- onDestroy
05-21 12:24:43.934 21834-21834/cjh.lauchmode D/tag-M--standard: tag-M--standard- onPause
05-21 12:24:44.384 21834-21834/cjh.lauchmode D/tag-M--standard: tag-M--standard- onStop
05-21 12:24:44.384 21834-21834/cjh.lauchmode D/tag-M--standard: tag-M--standard- onDestroy

可以看到,尽管我跳入是跳了5个Activity,但是最后退出却只输出了3次 onDestroy(),并且是在 C 销毁之后输出的,那么显然压在C上的实例早就被销毁了。


到此,对4个开启模式已经讲完了,有补充请留言,谢谢(卡哭哇啦一)!最后是Demo地址,虽然没什么,不过想想还是会有懒得童鞋的:http://download.csdn.net/detail/cjh_android/9527024

时间: 2024-10-14 00:57:17

用代码理解Acticity启动模式的相关文章

深入理解Activity启动模式

今天看到这个,觉得还不错,于是乎收藏下 作者原创连接    共分3篇: 深入理解Activity启动模式(一)–Activity与进程,线程的关系 深入理解Activity启动模式(二)–Activity,回退栈,Task之间的关系 深入理解Activity启动模式(三)–Activity启动模式特点 概述 Android官网介绍Activity的启动模式时比较含糊,介绍Application,Activity,Task,Process,Thread等概念以及它们之间的关系时,也没有说得清楚.大

Android 图文教学让你彻底理解activity启动模式

我们首先从最简单的开始, standard 这个模式就是默认的模式,我们都知道 当你用这个模式时,每次发送一个intent,都会生成一个新的实例! 我写一个简单的例子: 1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com

带你深入理解Activity启动模式(LaunchMode)

我们知道默认情况下,当我们多次启动同一个activity时,系统会创建多个实例并把他们一个个放入任务栈,当我们按back键,这些activity又会一个个退出.在讲activity的launchmode之前,我们有必要了解下"任务栈(Task Stack)"这个概念.在Android中是使用任务(Task)来管理Activity的,任务就是存放在栈里面的Activity的集合,这个栈就是称为任务栈. 一,Activity的LaunchMode 明白任务栈的概念后,我们再来了解Activ

Android开发学习之路--Activity之四种启动模式

后天终于可以回家了,马上就要过年了,趁着年底打酱油的模式,就多学习学习,然后记录记录吧.关于Activity已经学习了七七八八了,还有就是Activity的四种启动模式了,它们分别为,standard,singleTop,singleTask,singleInstance,根据名字也差不多可以理解这四种模式了: 1.standard:标准启动模式,默认情况下就是这个模式了,这个模式下启动的Activity会被多次实例化. 2.singleTop:这个模式下启动Activity的话,如果栈顶也是同

转载__Android--Activity的启动模式

http://www.cnblogs.com/plokmju/p/android_ActivityLauncherMode.html 前言 在一个Android应用中,不可避免的会包含多个Activity,当开启多个Activity之后,当按后退键时,一般会回退到上一个Activity,这一点和浏览器有点类似,但是需要注意的是Android系统只能回退到上一个Activity,没办法前进到下一个Activity,维护这个功能就需要了解到一个回退栈(Back Stack)的概念. 这篇博客就着重讲

彻底弄懂Activity四大启动模式

最近有几位朋友给我留言,让我谈一下对Activity启动模式的理解.我觉得对某个知识点的理解必须要动手操作才能印象深刻,所以今天写一篇博文,结合案例理解Activity启动模式.由于之前看过"区长"的一篇博文(文章结尾处有链接)深受启发,因此本文是在那篇文章的基础上更加全面的讲解. 众所周知当我们多次启动同一个Activity时,系统会创建多个实例,并把它们按照先进后出的原则一一放入任务栈中,当我们按back键时,就会有一个activity从任务栈顶移除,重复下去,直到任务栈为空,系统

Activity生命周期以及启动模式对生命周期的影响

前天用户体验反馈的一个需求,要求每次进入应用都定位到首页;这个操作很明显不适合放在首页Activity(启动模式为SingleTask)的onResume中,如果对Activity的启动模式和生命周期熟悉,那么很容易想到在onNewIntent里操作就可以了,这样在应用内跳转不至于每次都定位到首页. 可见,对Activity生命周期和启动模式进行一下梳理很有必要.下面主要描述一下Activty的生命周期,以及launchMode对生命周期的影响,onNewIntent,onSaveInstanc

(Android第一行代码)活动的启动模式

活动的启动模式 启动模式一共有四种,分别是 standard.singleTop. singleTask 和 singleInstance,可以在 AndroidManifest.xml 中通过给<activity>标签指定 android:launchMode属性来选择启动模式.下面我们来逐个进行学习. 1.standard模式:(对于使用 standard 模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建 该活动的一个新的实例.)   是活动默认的启动模式  修改

给大家分享一段启动模式代码

============问题描述============ 给大家分享一段启动模式的代码 @TargetApi(Build.VERSION_CODES.GINGERBREAD) @SuppressWarnings("unused") @Override public void onCreate() { if (Config.DEVELOPER_MODE && Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBRE