Activity的加载模式

     上一篇文章粗略地介绍了一下关于Android中Task的基本知识,不过实践才是检验真理的唯一标准,所以,今天就来试验一下Task中的launchMode是否真的实现了文档所说的那样。

首先,定义三个Activity,MainActivity打开SecondActivity,SecondActivity打开ThirdActivity,如下所示:

 


下面,我们定义Second Activity的Launch Mode,分别有下面几种情况:

1)Standard(即不定义)

首先是默认情况下,什么都不定义,如下:
  1. <application  
  2.     android:allowBackup="true"  
  3.     android:icon="@drawable/ic_launcher"  
  4.     android:label="@string/app_name"  
  5.     android:theme="@style/AppTheme" >  
  6.     <activity  
  7.         android:name="com.lms.taskdemo.MainActivity"  
  8.         android:label="@string/app_name" >  
  9.         <intent-filter>  
  10.             <action android:name="android.intent.action.MAIN" />  
  11.             <category android:name="android.intent.category.LAUNCHER" />  
  12.         </intent-filter>  
  13.     </activity>  
  14.     <activity  
  15.         android:name="com.lms.taskdemo.SecondActivity">  
  16.     </activity>  
  17.     <activity android:name="com.lms.taskdemo.ThirdActivity" >  
  18.     </activity>  
  19. </application>  
顺序打开三个Activity,看看结果:
  1. 04-21 15:23:28.373: V/com.lms.taskdemo(20473): Task : 70  
  2. 04-21 15:23:28.373: V/com.lms.taskdemo(20473): Base activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.MainActivity}  
  3. 04-21 15:23:28.373: V/com.lms.taskdemo(20473): Current activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.MainActivity}  
  4. 04-21 15:23:28.373: V/com.lms.taskdemo(20473): Number of activities : 1  
  5. 04-21 15:23:28.373: V/com.lms.taskdemo(20473): Number of running activities: 1  
  6. 04-21 15:23:31.336: V/com.lms.taskdemo(20473): Task : 70  
  7. 04-21 15:23:31.336: V/com.lms.taskdemo(20473): Base activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.MainActivity}  
  8. 04-21 15:23:31.336: V/com.lms.taskdemo(20473): Current activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.SecondActivity}  
  9. 04-21 15:23:31.336: V/com.lms.taskdemo(20473): Number of activities : 2  
  10. 04-21 15:23:31.336: V/com.lms.taskdemo(20473): Number of running activities: 2  
  11. 04-21 15:23:33.999: V/com.lms.taskdemo(20473): Task : 70  
  12. 04-21 15:23:33.999: V/com.lms.taskdemo(20473): Base activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.MainActivity}  
  13. 04-21 15:23:33.999: V/com.lms.taskdemo(20473): Current activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.ThirdActivity}  
  14. 04-21 15:23:33.999: V/com.lms.taskdemo(20473): Number of activities : 3  
  15. 04-21 15:23:33.999: V/com.lms.taskdemo(20473): Number of running activities: 3  

可以看到三个Activity,都是在同个Task中的。

2)SingleTask

为Second Activity,定义其launch mode 为 “singleTask”,如下:

  1. <application  
  2.     android:allowBackup="true"  
  3.     android:icon="@drawable/ic_launcher"  
  4.     android:label="@string/app_name"  
  5.     android:theme="@style/AppTheme" >  
  6.     <activity  
  7.         android:name="com.lms.taskdemo.MainActivity"  
  8.         android:label="@string/app_name" >  
  9.         <intent-filter>  
  10.             <action android:name="android.intent.action.MAIN" />  
  11.   
  12.             <category android:name="android.intent.category.LAUNCHER" />  
  13.         </intent-filter>  
  14.     </activity>  
  15.     <activity  
  16.         android:name="com.lms.taskdemo.SecondActivity"  
  17.         android:launchMode="singleTask">  
  18.     </activity>  
  19.     <activity android:name="com.lms.taskdemo.ThirdActivity" >  
  20.     </activity>  
  21. </application>  

再来看看其结果,如下:
  1. 04-22 10:31:26.197: V/com.lms.taskdemo(924): Task : 162  
  2. 04-22 10:31:26.217: V/com.lms.taskdemo(924): Base activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.MainActivity}  
  3. 04-22 10:31:26.217: V/com.lms.taskdemo(924): Current activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.MainActivity}  
  4. 04-22 10:31:26.217: V/com.lms.taskdemo(924): Number of activities : 1  
  5. 04-22 10:31:26.217: V/com.lms.taskdemo(924): Number of running activities: 1  
  6. 04-22 10:31:31.112: V/com.lms.taskdemo(924): Task : 162  
  7. 04-22 10:31:31.112: V/com.lms.taskdemo(924): Base activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.MainActivity}  
  8. 04-22 10:31:31.112: V/com.lms.taskdemo(924): Current activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.SecondActivity}  
  9. 04-22 10:31:31.112: V/com.lms.taskdemo(924): Number of activities : 2  
  10. 04-22 10:31:31.112: V/com.lms.taskdemo(924): Number of running activities: 2  
  11. 04-22 10:31:32.884: V/com.lms.taskdemo(924): Task : 162  
  12. 04-22 10:31:32.884: V/com.lms.taskdemo(924): Base activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.MainActivity}  
  13. 04-22 10:31:32.884: V/com.lms.taskdemo(924): Current activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.ThirdActivity}  
  14. 04-22 10:31:32.884: V/com.lms.taskdemo(924): Number of activities : 3  
  15. 04-22 10:31:32.884: V/com.lms.taskdemo(924): Number of running activities: 2  

发现虽然定义了SingleTask,但Second Activity和Main Activity还是在同一个Task中,这跟我们期望的不符,原因其实在于,设置了launchMode = SingleTask启动的Activity,在启动的时候,会去查找跟它的taskAffinity相同的task,如果存在这样一个task,就在这个task中启动,如果不存在这样一个task,才创建一个新的task,并在新task中启动。

而在这里,因为没有为各个activity定义taskAffinity,那么默认的affinity值就是包名,那么几个Activity都是一样的,所以就在同样的Task中启动了。

3)Single Task Different Task Affinity

下面,我们分别为Main Activity和 Second Activity设置不同的TaskAffinity值,如下:

  1. <application  
  2.     android:allowBackup="true"  
  3.     android:icon="@drawable/ic_launcher"  
  4.     android:label="@string/app_name"  
  5.     android:theme="@style/AppTheme" >  
  6.     <activity  
  7.         android:name="com.lms.taskdemo.MainActivity"  
  8.         android:label="@string/app_name"  
  9.         android:taskAffinity="com.lms.taskdemo.MainActivity" >  
  10.         <intent-filter>  
  11.             <action android:name="android.intent.action.MAIN" />  
  12.             <category android:name="android.intent.category.LAUNCHER" />  
  13.         </intent-filter>  
  14.     </activity>  
  15.     <activity  
  16.         android:name="com.lms.taskdemo.SecondActivity"  
  17.         android:launchMode="singleTask"  
  18.         android:taskAffinity="com.lms.taskdemo.SecondActivity" >  
  19.     </activity>  
  20.     <activity android:name="com.lms.taskdemo.ThirdActivity" >  
  21.     </activity>  
  22. </application>  

下面是结果,启动的顺序是Main Activity->Second Activity->Main Activity -> Second Activity -> Third Activity
  1. 04-22 10:26:27.818: V/com.lms.taskdemo(32677): Task : 151  
  2. 04-22 10:26:27.818: V/com.lms.taskdemo(32677): Base activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.MainActivity}  
  3. 04-22 10:26:27.818: V/com.lms.taskdemo(32677): Current activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.MainActivity}  
  4. 04-22 10:26:27.818: V/com.lms.taskdemo(32677): Number of activities : 1  
  5. 04-22 10:26:27.818: V/com.lms.taskdemo(32677): Number of running activities: 1  
  6. 04-22 10:26:31.362: V/com.lms.taskdemo(32677): Task : 152  
  7. 04-22 10:26:31.362: V/com.lms.taskdemo(32677): Base activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.SecondActivity}  
  8. 04-22 10:26:31.362: V/com.lms.taskdemo(32677): Current activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.SecondActivity}  
  9. 04-22 10:26:31.372: V/com.lms.taskdemo(32677): Number of activities : 1  
  10. 04-22 10:26:31.372: V/com.lms.taskdemo(32677): Number of running activities: 1  
  11. 04-22 10:26:36.558: V/com.lms.taskdemo(32677): Task : 151  
  12. 04-22 10:26:36.558: V/com.lms.taskdemo(32677): Base activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.MainActivity}  
  13. 04-22 10:26:36.558: V/com.lms.taskdemo(32677): Current activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.MainActivity}  
  14. 04-22 10:26:36.558: V/com.lms.taskdemo(32677): Number of activities : 1  
  15. 04-22 10:26:36.558: V/com.lms.taskdemo(32677): Number of running activities: 1  
  16. 04-22 10:26:39.401: V/com.lms.taskdemo(32677): Task : 153  
  17. 04-22 10:26:39.401: V/com.lms.taskdemo(32677): Base activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.SecondActivity}  
  18. 04-22 10:26:39.401: V/com.lms.taskdemo(32677): Current activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.SecondActivity}  
  19. 04-22 10:26:39.401: V/com.lms.taskdemo(32677): Number of activities : 1  
  20. 04-22 10:26:39.401: V/com.lms.taskdemo(32677): Number of running activities: 1  
  21. 04-22 10:26:41.123: V/com.lms.taskdemo(32677): Task : 153  
  22. 04-22 10:26:41.123: V/com.lms.taskdemo(32677): Base activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.SecondActivity}  
  23. 04-22 10:26:41.123: V/com.lms.taskdemo(32677): Current activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.ThirdActivity}  
  24. 04-22 10:26:41.123: V/com.lms.taskdemo(32677): Number of activities : 2  
  25. 04-22 10:26:41.123: V/com.lms.taskdemo(32677): Number of running activities: 2  

在上面的结果中,可以看到在启动Second Activity的时候,的确是在一个新的Task中启动了,Second Activity是这个Task中的根Activity,而由Second Activity启动的Third Activity也是在这个Task中启动的。

4)Single Instance

下面,我们再来看看Single Instance,同样的,先不定义Task Affinity,在AndroidManifest文件中定义如下:
  1. <application  
  2.     android:allowBackup="true"  
  3.     android:icon="@drawable/ic_launcher"  
  4.     android:label="@string/app_name"  
  5.     android:theme="@style/AppTheme" >  
  6.     <activity  
  7.         android:name="com.lms.taskdemo.MainActivity"  
  8.         android:label="@string/app_name">  
  9.         <intent-filter>  
  10.             <action android:name="android.intent.action.MAIN" />  
  11.             <category android:name="android.intent.category.LAUNCHER" />  
  12.         </intent-filter>  
  13.     </activity>  
  14.     <activity  
  15.         android:name="com.lms.taskdemo.SecondActivity"  
  16.         android:launchMode="singleInstance">  
  17.     </activity>  
  18.     <activity android:name="com.lms.taskdemo.ThirdActivity" >  
  19.     </activity>  
  20. </application>  

下面是结果:
  1. 04-22 10:29:43.207: V/com.lms.taskdemo(682): Task : 159  
  2. 04-22 10:29:43.207: V/com.lms.taskdemo(682): Base activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.MainActivity}  
  3. 04-22 10:29:43.207: V/com.lms.taskdemo(682): Current activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.MainActivity}  
  4. 04-22 10:29:43.207: V/com.lms.taskdemo(682): Number of activities : 1  
  5. 04-22 10:29:43.207: V/com.lms.taskdemo(682): Number of running activities: 1  
  6. 04-22 10:29:46.580: V/com.lms.taskdemo(682): Task : 160  
  7. 04-22 10:29:46.580: V/com.lms.taskdemo(682): Base activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.SecondActivity}  
  8. 04-22 10:29:46.580: V/com.lms.taskdemo(682): Current activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.SecondActivity}  
  9. 04-22 10:29:46.580: V/com.lms.taskdemo(682): Number of activities : 1  
  10. 04-22 10:29:46.580: V/com.lms.taskdemo(682): Number of running activities: 1  
  11. 04-22 10:29:48.202: V/com.lms.taskdemo(682): Task : 159  
  12. 04-22 10:29:48.202: V/com.lms.taskdemo(682): Base activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.MainActivity}  
  13. 04-22 10:29:48.202: V/com.lms.taskdemo(682): Current activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.ThirdActivity}  
  14. 04-22 10:29:48.202: V/com.lms.taskdemo(682): Number of activities : 2  
  15. 04-22 10:29:48.202: V/com.lms.taskdemo(682): Number of running activities: 1  
  16. 04-22 10:29:57.112: V/com.lms.taskdemo(682): Task : 160  
  17. 04-22 10:29:57.112: V/com.lms.taskdemo(682): Base activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.SecondActivity}  
  18. 04-22 10:29:57.112: V/com.lms.taskdemo(682): Current activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.SecondActivity}  
  19. 04-22 10:29:57.112: V/com.lms.taskdemo(682): Number of activities : 1  
  20. 04-22 10:29:57.112: V/com.lms.taskdemo(682): Number of running activities: 1  
可以看到启动Second Activity的时候,是在新的Task中,而当启动Third Activity的时候,它又跑回原来的Task中去了,这是跟文档描述中符合的,的确是新建的Task中只能有且仅有一个Activity。而由于我们没有定义Task Affinity,所以当启动Third Activity的时候,它就会去找相同Affinity的task,所以就会找到原来的Task,也即是说,如果定义了TaskAffinity的话,那以Third Activity就应该在新的Task中创建了,下面就来验证一下。

5)Single Instance Different Affinity

在配置文件中定义如下:
  1. <application  
  2.     android:allowBackup="true"  
  3.     android:icon="@drawable/ic_launcher"  
  4.     android:label="@string/app_name"  
  5.     android:theme="@style/AppTheme" >  
  6.     <activity  
  7.         android:name="com.lms.taskdemo.MainActivity"  
  8.         android:label="@string/app_name"  
  9.         android:taskAffinity="com.lms.taskdemo.MainActivity" >  
  10.         <intent-filter>  
  11.             <action android:name="android.intent.action.MAIN" />  
  12.   
  13.             <category android:name="android.intent.category.LAUNCHER" />  
  14.         </intent-filter>  
  15.     </activity>  
  16.     <activity  
  17.         android:name="com.lms.taskdemo.SecondActivity"  
  18.         android:launchMode="singleInstance"  
  19.         android:taskAffinity="com.lms.taskdemo.SecondActivity" >  
  20.     </activity>  
  21.     <activity android:name="com.lms.taskdemo.ThirdActivity" >  
  22.     </activity>  
  23. </application>  

下面来看看结果,如下:
  1. 04-22 10:27:58.866: V/com.lms.taskdemo(391): Task : 155  
  2. 04-22 10:27:58.866: V/com.lms.taskdemo(391): Base activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.MainActivity}  
  3. 04-22 10:27:58.866: V/com.lms.taskdemo(391): Current activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.MainActivity}  
  4. 04-22 10:27:58.866: V/com.lms.taskdemo(391): Number of activities : 1  
  5. 04-22 10:27:58.866: V/com.lms.taskdemo(391): Number of running activities: 1  
  6. 04-22 10:28:00.677: V/com.lms.taskdemo(391): Task : 156  
  7. 04-22 10:28:00.677: V/com.lms.taskdemo(391): Base activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.SecondActivity}  
  8. 04-22 10:28:00.677: V/com.lms.taskdemo(391): Current activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.SecondActivity}  
  9. 04-22 10:28:00.677: V/com.lms.taskdemo(391): Number of activities : 1  
  10. 04-22 10:28:00.677: V/com.lms.taskdemo(391): Number of running activities: 1  
  11. 04-22 10:28:02.309: V/com.lms.taskdemo(391): Task : 157  
  12. 04-22 10:28:02.309: V/com.lms.taskdemo(391): Base activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.ThirdActivity}  
  13. 04-22 10:28:02.309: V/com.lms.taskdemo(391): Current activity : ComponentInfo{com.lms.taskdemo/com.lms.taskdemo.ThirdActivity}  
  14. 04-22 10:28:02.309: V/com.lms.taskdemo(391): Number of activities : 1  
  15. 04-22 10:28:02.309: V/com.lms.taskdemo(391): Number of running activities: 1  

果然,如我们期望的那样,都是在一个新的Task中启动当前的Activity的。

总结:

     当使用Launch Mode 来改变系统默认的任务调度的时候,如果是用到Single Task或者Single Instance的时候,还要注意到Affinity的使用,要跟Affinity配合使用,可能才能达到我们期望中的效果。而Affinity,其实是Android提供的一个表从属意义的参数,类似于一个Tag值,它表明当前Activity属于哪一个Tag,相当的Affinity值的Activity,如果不使用其他的标志,如Single Instance之类,那么都会在存在于同一个task中。一般情况下,我们并不定义Task Affinity值,则其默认的值就是当前App的包名。
    四种模式:
    standard模式:可以多次实例化,可以几个相同的Activity重叠。

    singleTop模式:可以多次实例化,但是不可以多个相同的Activity重叠,当堆栈的顶部为相同的Activity时,会调用onNewIntent函数。

    singleTask模式:在使用默认taskAffinity的情况下,同一个应用中调用该Activity时,如果该Activity没有被实例化,会在本应用程序的Task内实例化,如果已经实例化,会将Task中其上的Activity销毁后,调用onNewIntent;其它应用程序调用该Activity时,如果该Activity没有被实例化,会创建新的Task并实例化后入栈,如果已经实例化,会销毁其上的Activity,并调用onNewIntent。

    singleInstance模式:加载该Activity时如果没有实例化,他会创建新的Task后,实例化入栈,如果已经存在,直接调用onNewIntent,该Activity的Task中不允许启动其它的Activity,任何从该Activity启动的其他Activity都将被放到其他task中,先检查是否有本应用的task,没有的话就创建。

转载:http://blog.csdn.net/linmiansheng/article/details/24297375
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值