Android基础之LaunchMode案例分析

Android基础之LaunchMode案例分析

同上一篇文章一样,这篇文章也是通过实例对LaunchMode进行分析总结,LaunchMode在App开发中用到的地方比较多,相信大家都知道在Android中有四种LaunchMode,它们分别是:
1. standard(默认)
2. singleTask
3. singleTop
4. singleInstance

下面结合实例来对这四种LaunchMode进行分析,Demo还是用上篇文章中的那个Demo.

LaunchMode之standard模式

standard模式是Activity启动的默认模式,也就是说在不设置launchMode的情况下,默认的就是standard模式,该模式的主要特点是启动一次创建一个实例,比如Activity A启动Activity B,Activity B启动Activity C,Activity C启动Activity C,那么栈顶还是会再次创建一个Activity C实例。具体我们来看Demo:
在Demo中存在4个Activity,MainActivityMain2ActivityMain3ActivityMain4Activity,我们这样设置启动,看看Mainifest文件以及启动流程:

<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=".Main2Activity"/>
<activity android:name=".Main3Activity"/>
<activity android:name=".Main4Activity"/>

Android基础之LaunchMode案例分析_第1张图片
运行Demo,看下Log输出:

 I/secray: MainActivity: com.sye.launchmode1.MainActivity@5ea4b9e
                         task id = 7609
 I/secray: Main2Activity: com.sye.launchmode1.Main2Activity@21095ae
                          task id = 7609
 I/secray: Main3Activity: com.sye.launchmode1.Main3Activity@301c21a
                          task id = 7609
 I/secray: Main4Activity: com.sye.launchmode1.Main4Activity@1d24f46
                          task id = 7609
 I/secray: MainActivity: com.sye.launchmode1.MainActivity@a028d3d
                         task id = 7609

standard模式是默认的启动模式,比较容易理解。

LaunchMode之singleTask模式

singleTask模式与上一篇文章中的FLAG_ACTIVITY_NEW_TASK的作用是有点相似,singleTask模式是当存在含有与目标Activity相同的task时,直接将该task置于前台,并且会将目标Activity之上的Activity出栈,目标Activity置于栈顶;如果没有,则会创建一个新的task,将目标Activity置于task底部。而FLAG_ACTIVITY_NEW_TASK是存在与目标Activity相同的task时,直接将task最后的状态恢复,并不会将目标Activity之上的Activity出栈。
继续来看Demo,重新设置一下Mainifest文件:

<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=".Main2Activity"
   android:launchMode="singleTask"
   android:taskAffinity="com.android.test"/>
<activity android:name=".Main3Activity"/>
<activity android:name=".Main4Activity"/>

这里有点需要注意一下,如果Main2Activity启动Main3Activity,然后Main3Activity启动Main4Activity,并且不设置Flag以及启动模式默认,那么Main3ActivityMain4Activity都属于Main2Activity所在的task。这里我需要MainActivityMain4Activity要在一个task中,所以在Main3Activity启动Main4Activity时设置一个Flag,当然,办法不是这一种:

Intent intent = new Intent(Main3Activity.this, Main4Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

这样MainActivityMain4Activity就在同一task中了。流程与上篇文章中有个流程一样:
Android基础之LaunchMode案例分析_第2张图片

运行程序看看Log:

I/secray: MainActivity: com.sye.launchmode1.MainActivity@88de008
                        task id = 7665
I/secray: Main2Activity: com.sye.launchmode1.Main2Activity@286d598
                         task id = 7666
I/secray: Main3Activity: com.sye.launchmode1.Main3Activity@71e23a4
                         task id = 7666
I/secray: Main4Activity: com.sye.launchmode1.Main4Activity@e9b9c70
                         task id = 7665

dump信息:

Running activities (most recent first):
TaskRecord{1d5ad6c #7666 A=com.android.test U=0 StackId=1 sz=1}
    Run #2: ActivityRecord{809138b u0 com.sye.launchmode1/.Main2Activity t7666}
TaskRecord{c2f153b #7665 A=com.sye.launchmode1 U=0 StackId=1 sz=2}
    Run #1: ActivityRecord{23f336b u0 com.sye.launchmode1/.Main4Activity t7665}
    Run #0: ActivityRecord{cef59e u0 com.sye.launchmode1/.MainActivity t7665}

会发现Main3Activity的确出栈了。

LaunchMode之singleTop模式

singleTop模式在上篇文章提到过,作用与Intent的Flag——FLAG_ACTIVITY_SINGLE_TOP一样的,这里就简单描述下,不懂的可以去看看上篇文章。
假设有三个Activity A,B,C, A启动B,B启动C,C的launchMode设置为singleTop,那么C再次启动C时,C就不会在启动了,也就是说栈中顺序是A,B,C。如果B的launchMode为singleTop,C为默认,那么在C中再启动B时,还是会创建一个B的实例。

LaunchMode之singleInstance模式

singleInstance模式也较容易理解,当一个Activity的launchMode为singleInstance时,会重新创建一个task来装载该Activity,并且这个task中只存在该Activity一个实例。
还是来看Demo,4个Activity都设置成默认启动方式,然后再设置Main3Activity的launchMode为singleTop,运行Demo,查看结果:

I/secray: MainActivity: com.sye.launchmode1.MainActivity@cdb03a1
                        task id = 7670
I/secray: Main2Activity: com.sye.launchmode1.Main2Activity@40d71f1
                         task id = 7670
I/secray: Main3Activity: com.sye.launchmode1.Main3Activity@b89550d
                         task id = 7671
I/secray: Main4Activity: com.sye.launchmode1.Main4Activity@8bebe9
                         task id = 7670

Log信息可以看出来只有Main3Activity的taskid不同,其他的Activity都是相同的。

你可能感兴趣的:(Android基础之LaunchMode案例分析)