taskAffinity属性的奇特效果

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


首先写一个应用A1,它有两个Activity(Activity1和Activity2),AndroidManifest.xml如下: 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.taskdemo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.taskdemo.<span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">Activity1</span>"
            android:label="@string/app_name"
            android:taskAffinity="com.task" >
        </activity>
        <activity android:name="com.example.taskdemo.<span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">Activity2</span>" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
 然后,我们再写一个应用A2,它包含一个Activity(MainActivity ),AndroidManifest.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.taskdemo2"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:taskAffinity="com.task"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.taskdemo2.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>
    </application>

</manifest>
运行一下看看下过吧 ....就知道里面是怎么跑的了.....

总结:
 当一个应用程序加载一个singleTask模式的Activity时,首先该Activity会检查是否存在与它的taskAffinity相同的Task。 

    1、如果存在,那么检查是否实例化,如果已经实例化,那么销毁在该Activity以上的Activity并调用onNewIntent。如果没有实例化,那么该Activity实例化并入栈。 

    2、如果不存在,那么就重新创建Task,并入栈。 

 用一个流程来表示: 

   然后我们来检测singleTask模式融入taskAffinity时的情况,我们也是用上文中测试singleTask的例子,在此不列出,读者翻阅前文查阅。唯一不同的是,我们将A2和Activity2设置成相同的taskAffinity。 

    我们发现测试结果也有一定的出入,就是,当从singleTask中启动Activity时,并没用重新创建一个Task,而是进入了和它具有相同affinity的MyActivity所在的Task。 

    于是,我们也能得到以下结论: 

    1、当一个应用程序加载一个singleTask模式的Activity时,如果该Activity没有被实例化,那么就重新创建一个Task,并入栈,如果已经被实例化,那么就调用该Activity的onNewIntent; 

    2、singleTask的Activity所在的Task不允许存在其他Activity,任何从该Activity加载的其它 Actiivty(假设为Activity2)都会被放入其它的Task中,如果存在与Activity2相同affinity的Task,则在该 Task内创建Activity2。如果不存在,则重新生成新的Task并入栈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值