android:taskAffinity使用记录

每个activity都有一个taskAffinity,具有相同taskAffinity的activity可以被看做是同一个task.activity的taskAffinity是有他的root Activity决定的。taskAffinity 决定了activity将要重新加入的的那个task是哪个。

     前面说了,具有相同taskAffinity的可以被看做是同一个task。

当通过FLAG_ACTIVITY_NEW_TASK 启动一个activity时,该task将具有相同taskAffinity的activity聚集起来,同属一个任务。默认情况下,所以activity的taskAffinity,是相同的,即应用程序的包名,你也可以通过设置不同的taskAffinity,来将activity分配到不同的task中。注通过FLAG_ACTIVITY_NEW_TASK 启动的任务,若点击home,回到主界面,点击查看后台任务按钮,可以看到该应用有两个后台任务,另一个即你FLAG_ACTIVITY_NEW_TASK 启动的那个。

 taskAffinity名字不易太短,太短运行会提示错误。

想像这样一个场景,application 1和2,application1中一个MainActivity,其配置如下

   <activity
            android:allowTaskReparenting="true"
            android:name=".MainActivity"
            android:taskAffinity="com.test"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

application2里面有一个MainActivity.java和TestActivity.java,TestActivity1.java配置如下:

 <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:taskAffinity="com.test"
            android:name=".TestActivity"
            android:label="@string/title_activity_test" >


先启动app1,然后按home键,app1到了后台当中,然后启动app2,app2中MainActivity->TestActivity.java->TestActivity1.java,然后按返回键,按理应该是TestActivity1.java->TestActivity.java->MainActivity.java,可我们会看到这样TestActivity1.java->TestActivity.java->MainActivity.java(app1的)->MainActivity.java,这是因为app1的MainActivity的taskAffinity和app2的TestActivity和TestActivity1的相同,可以认为属于同一任务,所以当app1回到后台时 ,当再次有相同任务启动时,其就会被该任务所收留,所以就出现的这种现象,注意app1的MainActivity的 android:allowTaskReparenting="true"属性要设置为true,去掉无此效果android:allowTaskReparenting表明activity是否被允许从task中移除,加入到和他有相同taskAffinity标志的task中去,当有相同taskAffinity的task被bring to front时。


或者这样启动程序,先启动APP2,MainActivity->TestActivity.java->TestActivity1.java,进入TestActivity1,按home键将其置于后台,在启动app1,此时奇怪的事情发生了,你不会看到app1的MainActivity,你看到的仍然是app2处于最顶端的TestActivity1的页面。

当app2按MainActivity->TestActivity.java->TestActivity1.java顺序跳到TestActivity1时,在TestActivity1里面执行finishAffinity();会finish掉当前的TestActivity1.java和同处于一个Task的TestActivity.java。显示出MainActivity的界面。

谨此记录。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值