码迷,mamicode.com
首页 > 其他好文 > 详细

Activity之affinity

时间:2016-05-12 18:50:46      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

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,它包含一个ActivityMyActivity),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 中去了。




Activity之affinity

标签:

原文地址:http://blog.csdn.net/qq_25184739/article/details/51356108

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!