android:taskAffinity
taskAffinity
attributes. See that attribute for more information.
By default, all activities within an application share the same affinity. The name of that affinity is the same as the package name set by the <manifest>
element.
activity的亲属关系, 默认情况同一个应用程序下的activity有相同的关系
================================以下为转转http://winuxxan.blog.51cto.com/2779763/504835=========
Activity的归属,也就是Activity应该在哪个Task中,Activity与Task的吸附关系。我们知道,一般情况下在同一个应用中,启动的Activity都在同一个Task中,它们在该Task中度过自己的生命周期,这些Activity是从一而终的好榜样。
那么为什么我们创建的Activity会进入这个Task中?它们会转到其它的Task中吗?如果转到其它的Task中,它们会到什么样的Task中去?
解决这些问题的关键,在于每个Activity的taskAffinity属性。
每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task。如果一个Activity没有显式的指明该Activity的taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果Application也没有指明,那么该taskAffinity的值就等于包名。而Task也有自己的affinity属性,它的值等于它的根Activity的taskAffinity的值。
一开始,创建的Activity都会在创建它的Task中,并且大部分都在这里度过了它的整个生命。然而有一些情况,创建的Activity会被分配其它的Task中去,有的甚至,本来在一个Task中,之后出现了转移。我们首先分析一下android文档给我们介绍的两种情况。
第一种情况。如果该Activity的allowTaskReparenting设置为true,它进入后台,当一个和它有相同affinity的Task进入前台时,它会重新宿主,进入到该前台的task中。
我们验证一下这种情况。
Application | Activity | taskAffinity | allowTaskReparenting |
application1 | Activity1 | com.winuxxan.affinity | true |
application2 | Activity2 | com.winuxxan.affinity | false |
我们创建两个工程,application1和application2,分别含有Activity1和Activity2,它们的taskAffinity相同,Activity1的allowTaskReparenting为true。
首先,我们启动application1,加载Activity1,然后按Home键,使该task(假设为task1)进入后台。然后启动application2,默认加载Activity2。
我们看到了什么现象?没错,本来应该是显示Activity2,但是我们却看到了Activity1。实际上Activity2也被加载了,只是Activity1重新宿主,所以看到了Activity1。
第二种情况。如果加载某个Activity的intent,Flag被设置成FLAG_ACTIVITY_NEW_TASK时,它会首先检查是否存在与自己taskAffinity相同的Task,如果存在,那么它会直接宿主到该Task中,如果不存在则重新创建Task。
我们来做一个测试。
我们首先写一个应用,它有两个Activity(Activity1和Activity2),AndroidManifest.xml如下:
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".Activity1"
- android:taskAffinity="com.winuxxan.task"
- android:label="@string/app_name">
- </activity>
- <activity android:name=".Activity2">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
Activity2的代码如下:
- public class Activity2 extends Activity {
- private static final String TAG = "Activity2";
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main2);
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- Intent intent = new Intent(this, Activity1.class);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(intent);
- return super.onTouchEvent(event);
- }
- }
然后,我们再写一个应用MyActivity,它包含一个Activity(MyActivity),AndroidManifest.xml如下:
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".MyActivity"
- android:taskAffinity="com.winuxxan.task"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
我们首先启动MyActivity,然后按Home键,返回到桌面,然后打开Activity2,点击Activity2,进入Activity1。然后按返回键。
(MyActivity进入了com.winuxxan.task 这个栈中)
我们发现,我们进入Activity的顺序为Activity2->Activity1,而返回时顺序为Activity1->MyActivity——》Activity2。
这就说明了一个问题,Activity1在启动时,重新宿主到了MyActivity所在的Task中去了。
(在打开MyActivity时进入了一个新的栈com.winuxxan.taskMyActivity被添加到这个栈的后面。故而,会点击返回时进入MyActivty)
以上是验证了文档中提出的两种TaskAffinity的用法。
-------------------------------------------------------
=======================================结束================================================
感谢:Android的七巧板Activity之三 Activity的归属http://winuxxan.blog.51cto.com/2779763/504835
http://henzil.easymorse.com/?p=481
http://blog.sina.com.cn/s/blog_6916fad10100ue7z.html
http://blog.sina.com.cn/s/blog_61f4999d0100qlv5.html
http://blog.csdn.net/ghj1976/article/details/6371549