现在的位置: 首页 > 综合 > 正文

Activity的LaunchMode和taskAffinity,有点绕

2013年03月08日 ⁄ 综合 ⁄ 共 1637字 ⁄ 字号 评论关闭

今天在看Music的源码,AndroidManifest.xml中的application结点有android:taskAffinity属性,特意找了资料看了一下,越看越复杂,转载下,有空再仔细看一下:

    <application
        android:allowTaskReparenting="true"
        android:icon="@drawable/app_music"
        android:label="@string/musicbrowserlabel"
       
android:taskAffinity="android.task.music" >

Activity的LaunchMode和taskAffinity

    做项目到现在都一直没有理解LaunchMode有什么用,或许根本就没真正花心思去看,所以今天把这部分整理下。

    设置Activity的LaunchMode属性可以决定这个Activity是和当前Task保持关联,还是说每次运行这个Activity是新建一个实例,还是保持单例。

  Task和Back Stack简介

  task是一组Activities的集合,一组Activities被Stack(back stack)所管理。

  在一个应用中,有3个activities,分别是activity1,activity2,activity3,首先activity1被start,此时,如果应用没有创建task则创建,并把activity1压入栈顶,activity1触发onCreate->onStart->onResume。


    接着activity1转向到activity2时,activity1先触发onPause,activity2触发onCreate->onStart->onResume,然后activity1触发onPause->onStop,activity2压入栈顶。

  

  以此类推,activity2转向activity3也是一样的步骤。那么当前栈顶是activity3。

  

  当我们按下手机上的返回键时,栈顶的activity3触发onPause,activity2需要从状态stop到pause,所以触发了onPause->onStart->onResume,activity3触发onStop->onDestory,因为activity3从栈顶弹出,所以触发onDestory,此时,activity2在栈顶。

  back stack

  如果继续按返回键,当前栈顶的activity弹出并被destory,直到home界面。当所有的activity都弹出了,这个task也就消亡了。

  当开始一个新的task时,前一个task被设置为后台,在后台,所有的activity都处理stop状态,但是back stack保留了所有后台activity的状态信息,只是丢失了焦点。

task

  反复的在两个activity之间切换,activity会产生多个独立的实例。

  stack

  查阅有关Activity生命周期更多说明。

  两种方式设置LaunchMode属性

    1.  在 manifest文件中设置

1 <activity android:name=".activity.ActivityA"
2         android:launchMode="standard">
3     <intent-filter>
4         <action android:name="android.intent.action.MAIN" />
5             <category android:name="android.intent.category.LAUNCHER" />
6     </intent-filter>
7 </activity>

    2.  使用Intent flags设置 

1 Intent
intent = 
new Intent();

抱歉!评论已关闭.