TaskAffinit属性详解

来源:互联网 发布:nginx第三方模块下载 编辑:程序博客网 时间:2024/06/13 21:25

该属性用来指定Activity应该在哪个Task中(Activity与Task的吸附关系)。

一般情况:下在同一个App中,所启 动的Activity都是在同一个Task中的,这里你可以想为何都是在同一个Task中?会不会不在同一个Task中?Activity和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中。

验证以下这种情况。

APP
ActivitytaskAffinityallowTaskReparentingApp1Activity1aaatrueApp2Activity2aaafalse

我们创建两个工程,App1App2,分别含有Activity1和Activity2,它们的taskAffinity相同,Activity1的allowTaskReparenting为true。

首先,我们启动App1,加载Activity1,然后按Home键,进入后台。然后启动App2,加载Activity2。

现象:本来应该是显示Activity2,却看到了Activity1。实际上Activity2也被加载了,只是Activity1重新宿主,所以看到了Activity1。



第二种情况》》如果加载某个Activity的intent,Flag被设置成FLAG_ACTIVITY_NEW_TASK时,它会首先检查是否存在与自 己taskAffinity相同的Task,如果存在,那么它会直接宿主到该Task中,如果不存在则重新创建Task。


App1:AndroidManifest.xml 在SecondActivity节点  中设置了taskAffinity 然后在MainActivity.java中通过点击Button的事件来打开SecondActivity: 注意的是在Intent中设置:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

 <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <activity android:name=".SecondActivity" android:taskAffinity="aaa.aaa">        </activity>

App2:直接给MainActivity设置taskAffinity

 <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".MainActivity" android:taskAffinity="aaa.aaa">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>

App1和App2的taskAffinity是相同的,首先打开App2按HOME》 接着打开App1》点击打开SecondActivity 》按返回

现象分析:

进入Activity的顺序为Activity2->Activity1,而返回时顺序为 Activity1->MyActivity。这就说明了一个问题,Activity1在启动时,重新宿主到了MyActivity所在的Task 中去了。

以上是验证了文档中提出的两种TaskAffinity的用法


0 0
原创粉丝点击