Activity之affinity

affinity


affinity表示activity 预期所处的 task 缺省情况下,同一个应用中的所有 activity 都拥有同一个 affinity 值。因此,同一个应用中的所有 activity 默认都期望位于同一个 task 中。不过,你可以修改 activity 默认的 affinity 值。不同应用中的 activity 可以共享同一个 affinity 值,同一个应用中的 activity 也可以赋予不同的 task affinity 值。你可以用<activity> 元素的taskAffinity 属性修改 activity affinity如下面代码所示taskAffinity 属性是一个字符串值,必须与<manifest> 元素定义的包名称保证唯一性,因为系统把这个包名称用于标识应用的默认 task affinity 值。

<activity android:name=".MainActivity" 
	  android:taskAffinity=".cwp.affinity" >
	<intent-filter> 
		 <action android:name="android.intent.action.MAIN" />
		 <category android:name="android.intent.category.LAUNCHER" /> 
	</intent-filter> 
</activity>

affinity 将在以下两种情况下发挥作用:
当一个 activity allowTaskReparenting 属性设为 "true" 。这种情况下,当某个 task 进入前台时, activity affinity 值又与其相同,则它可以从启动时的 task 移入这个 task 中。我们验证一下这种情况。

<strong>Application Activity taskAffinity allowTaskReparenting </strong>
application1 Activity1 com.winuxxan.affinity true
application2 Activity2 com.winuxxan affinity false 

我们创建两个工程,application1application2,分别含有Activity1Activity2,它们的taskAffinity相同,Activity1allowTaskReparentingtrue首先,我们启动application1,加载Activity1,然后按Home键,使该task(假设为task1)进入后台。然后启动application2,默认加载Activity2我们看到了什么现象?没错,本来应该是显示Activity2,但是我们却看到了Activity1。实际上Activity2也被加载了,只是Activity1重新宿主,所以看到了Activity1


当启动activity intent 包含了FLAG_ACTIVITY_NEW_TASK标志。默认情况下,一个新的 activity 将被放入调用 startActivity() activity 所在 task 中,且压入调用者所处的back stack 顶。不过,如果传给startActivity() intent 包含了FLAG_ACTIVITY_NEW_TASK 标志,则系统会查找另一个task 并将新 activity 放入其中。
这时经常会新开一个任务,但并非一定如此。如果一个已有 task affinity 值与新 activity 的相同,则 activity 会放入该task如果没有,则会新建一个新task。如果本标志使得 activity 启动了一个新的 task,用户按下Home 键离开时,必须采取一些措施让用户能回到此 task某些应用(比如通知管理器)总是让 activity 放入其它 task 中启动,而不是放入自己的task 中。因此,它们总是把FLAG_ACTIVITY_NEW_TASK 标志置入传给startActivity() intent 中。如果你的activity 可以被外部应用带此标志来启动,请注意用户会用其它方式返回启动task,比如通过应用图标(task 的根 activity 带有一个CATEGORY_LAUNCHERintent 过滤器;参阅下节#启动task)。

我们来做一个测试。我们首先写一个应用,它有两个ActivityActivity1Activity2),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。然后按返回键。我们发现,我们进入Activity的顺序为Activity2->Activity1,而返回时顺序为 Activity1->MyActivity。这就说明了一个问题,Activity1在启动时,重新宿主到了MyActivity所在的Task 中去了。




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值