您的位置:首页 > 移动开发 > Android开发

Activity之affinity

2016-05-09 21:09 399 查看

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

我们创建两个工程,application1和application2,分别含有Activity1和Activity2,它们的taskAffinity相同,Activity1的allowTaskReparenting为true。首先,我们启动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)。

我们来做一个测试。我们首先写一个应用,它有两个Activity(Activity1和Activity2),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
中去了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息