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
中去了。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories