今天在看Music的源码,AndroidManifest.xml中的application结点有android:taskAffinity属性,特意找了资料看了一下,越看越复杂,转载下,有空再仔细看一下:
android:allowTaskReparenting="true"
android:icon="@drawable/app_music"
android:label="@string/musicbrowserlabel"
android:taskAffinity="android.task.music" >
Activity的LaunchMode和taskAffinity
设置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在栈顶。
如果继续按返回键,当前栈顶的activity弹出并被destory,直到home界面。当所有的activity都弹出了,这个task也就消亡了。
当开始一个新的task时,前一个task被设置为后台,在后台,所有的activity都处理stop状态,但是back stack保留了所有后台activity的状态信息,只是丢失了焦点。
反复的在两个activity之间切换,activity会产生多个独立的实例。
查阅有关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 new Intent(); |
|