Activity launchMode

Activity在AndroidManifest.xml中可以指明的launchMode可以有:
standard,singleTop,singleTask,singleInstance。这些启动模式是针对于Activity在Task中的位置,来产生不同。
1 standard 默认启动模式
每次通过standard启动Activity都会生成一个新的Activity实例,举例来说,
AndroidManifest.xml

 <activity android:name=".My1Activity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="My1" />
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
<activity android:name=".My2Activity" android:launchMode="standard" >
            <intent-filter>
                <action android:name="My2" />
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

在 .My1Activity中连续启动两次.My2Activity

         Intent intent=new Intent("My2");
         startActivity(intent);
         startActivity(intent);

通过命令行 adb shell dumpsys activity activities | grep -E “Stack #|Task id #| Hist #” 可以看到 .My2Activity在上层有两个实例

Stack #1:
    Task id #122
      * Hist #2: ActivityRecord{41f9c3c0 u0 com.alvin.activity.test/.My2Activity t122}
      * Hist #1: ActivityRecord{41f82d40 u0 com.alvin.activity.test/.My2Activity t122}
      * Hist #0: ActivityRecord{423d86f0 u0 com.alvin.activity.test/.My1Activity t122}

2 singleTop

每次通过singleTop启动Activity2,如果当前Task顶是Activity2,则不生成新的实例,但是会调用Activity2的onNewIntent方法。,否则会生成一个新的Activity实例(如同standard),举例来说,

<!--AndroidManifest.xml-->
<!--<activity android:name=".My2Activity" android:launchMode="standard" >-->
  <activity android:name=".My2Activity" android:launchMode="singleTop" >
         //在 .My1Activity中启动My2Activity
                Intent intent=new Intent("My2");
                startActivity(intent);
         //在 .My2Activity中启动My2Activity
                Intent intent=new Intent("My2");
                startActivity(intent);

通过命令行 adb shell dumpsys activity activities | grep -E “Stack #|Task id #| Hist #” 可以看到 .My2Activity在上层有两个实例

Stack #1:
    Task id #127
      * Hist #1: ActivityRecord{41f63080 u0 com.alvin.activity.test/.My2Activity t127}
      * Hist #0: ActivityRecord{420f57a8 u0 com.alvin.activity.test/.My1Activity t127}

3 singleTask
通过singleTask启动的Activity在当前Task中只能有一个实例,假设从Task底到顶是My1Activity,My2Activity,My3Activity 如果此时再去启动My2Activity。会清除My2Activity上的所有Activity并调用My2Activity的onNewIntent。否则跟standard一样。

<!--AndroidManifest.xml-->
 <activity android:name=".My2Activity" android:launchMode="singleTask" >
        <!--<activity android:name=".My2Activity" android:launchMode="singleTop" >-->
            <intent-filter>
                <action android:name="My2" />
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
        <activity android:name=".My3Activity">
            <intent-filter>
                <action android:name="My3" />
                <category android:name="android.intent.category.DEFAULT"/>

            </intent-filter>
        </activity>

step 1.在 .My1Activity中启动My2Activity

        startActivity(new Intent("My2"));

step 2.在 .My2Activity中启动My3Activity

         startActivity(new Intent("My3")); 

此时 Task为

Stack #1:
    Task id #128
      * Hist #2: ActivityRecord{422dd1a0 u0 com.alvin.activity.test/.My3Activity t128}
      * Hist #1: ActivityRecord{41f63080 u0 com.alvin.activity.test/.My2Activity t128}
      * Hist #0: ActivityRecord{41f7dbd8 u0 com.alvin.activity.test/.My1Activity t128}

step 3 在 .My3Activity中启动My2Activity

此时 Task为

Stack #1:
    Task id #128
      * Hist #1: ActivityRecord{41f63080 u0 com.alvin.activity.test/.My2Activity t128}
      * Hist #0: ActivityRecord{41f7dbd8 u0 com.alvin.activity.test/.My1Activity t128}

4 singleInstance
通过singleInstance启动的Activity,总是在一个单独的Task里面,而且这个Task里面只有这一个Activity。多次启动只会调用Activity的onNewIntent方法。

<!--AndroidManifest.xml-->
 <activity android:name=".My2Activity" android:launchMode="singleInstance" >
        <!--<activity android:name=".My2Activity" android:launchMode="singleTop" >-->
            <intent-filter>
                <action android:name="My2" />
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

step 1.在 .My1Activity中启动My2Activity

        startActivity(new Intent("My2"));

此时 Task为

Stack #1:
    Task id #131
      * Hist #0: ActivityRecord{43566f00 u0 com.alvin.activity.test/.My2Activity t131}
    Task id #130
      * Hist #0: ActivityRecord{4278c838 u0 com.alvin.activity.test/.My1Activity t130}

step 2.在 .My2Activity中启动My3Activity

         startActivity(new Intent("My3")); 

此时 Task为

Stack #1:
    Task id #130
      * Hist #1: ActivityRecord{43136f70 u0 com.alvin.activity.test/.My3Activity t130}
      * Hist #0: ActivityRecord{4278c838 u0 com.alvin.activity.test/.My1Activity t130}
    Task id #131
      * Hist #0: ActivityRecord{43566f00 u0 com.alvin.activity.test/.My2Activity t131}

看到没有,My3Activity又重新回到了My1Activity中。但是不管怎么说它们都属于同一个Stack。但是此时如果在My3Activity上按back健会回到My1Activity。back是基于Task来操作的。Task会变成

Stack #1:
    Task id #130
      * Hist #0: ActivityRecord{4278c838 u0 com.alvin.activity.test/.My1Activity t130}
    Task id #131
      * Hist #0: ActivityRecord{43566f00 u0 com.alvin.activity.test/.My2Activity t131}

但是此时如果在My1Activity上按back健会回到My2Activity,Task会变成

 Stack #1:
    Task id #131
      * Hist #0: ActivityRecord{43566f00 u0 com.alvin.activity.test/.My2Activity t131}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值