Android launchMode 笔记---taskAffinity属性和Intent标记体会
case 1:在AndroidManifest.xml中定义的属性为:
<activity android:name="com.coder80.appother.MainActivity" android:label="AppOther MainActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> ... .... .... .... <activity android:name="com.coder80.appother.OtherActivity" android:label="AppOther OtherActivity" > </activity>app运行效果如下:
在OtherActivity界面,多次点击“Start AppOther OtherActivity in AppOther”按钮,会启动多个Activity Instance,由于两个Activity拥有共同的taskAffinity,将处于同一个task里面。
case 2:在AndroidManifest.xml中定义的属性为:
<activity android:name="com.coder80.appother.MainActivity" android:label="AppOther MainActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.coder80.appother.OtherActivity" android:label="AppOther OtherActivity" android:taskAffinity="com.xxxx" > </activity>app运行效果如下:
在OtherActivity界面,点击“Start AppOther OtherActivity in AppOther”按钮,创建新的Activity Instance,由于两个Activity拥有的taskAffinity不同,新的instant将处于另外的task里面,其task id 为23.
PS:此处多次点击点击“Start AppOther OtherActivity in AppOther”按钮,不会产生新的Activity Instance。
在case 2中,当界面停留在OtherActivity时,此时按Home键,让app进入后台运行,再次启动app,将直接显示MainActivity界面,而不是OtherActivity界面。主要原因是,该app的启动时,系统将寻找root Activity所处的那个task,而该app的root activity为MainActivity,所以显示MainActivity界面。
case 3:在AndroidManifest.xml中定义的属性为与case 1一致。
此时Activity之间的导航,与普通的跳转一致,task的创建与否,直接根据launchMode来确定。
allowTaskReparenting讲解:
这个属性用来标记一个Activity实例在当前应用退居后台后,是否能从启动它的那个task移动到有共同affinity的task,“true”表示可以移动,“false”表示它必须呆在当前应用的task中,默认值为false。
如果一个Activity的<activity>元素没有设定此属性,则为默认方式。继续用demo进行演示,进行深入浅出的分析。
应用TaskAffinity的MainActivity中,点击按钮,进入应用AppOther的OtherActivity,其对应AndroidManifest.xml中定义的属性如下:
TaskAffinity的AndroidManifest.xml
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.coder80.taskaffinity.MainActivity" android:label="TaskAffinity MainActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
AppOther的AndroidManifest.xml
<activity android:name="com.coder80.appother.OtherActivity" android:label="AppOther OtherActivity" > <intent-filter> <action android:name="android.intent.action.AppOther_OTHER_ACTIVITY" /> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>首先运行TaskAffinity应用,启动界面如下:
点击“Start AppOther OtherActivity”按钮,执行如下的代码:
Intent intent = new Intent("android.intent.action.AppOther_OTHER_ACTIVITY"); startActivity(intent);将启动AppOther中的OtherActivity界面,效果如下:
两个Activity的task id 一致,表明是在同一个task里面。此时,按下“Home”键,显示主屏,之后再菜单中点击TaskAffinity应用图标,启动之后,界面如下:
依旧显示的是AppOther应用的OtherActivity界面。
由此demo,了解到,不同应用的Activity,可以处于同一个task里面,并且使用默认的allowTaskReparenting属性,其task在由后台转入前台时,不会从task remove。
示例将做小小改动,修改AppOther中OtherActivity的属性,将allowTaskReparenting置为true,其他的代码,不做任何修改,AndroidManifest.xml如下:
<activity android:name="com.coder80.appother.OtherActivity" android:label="AppOther OtherActivity" android:allowTaskReparenting="true" > <intent-filter> <action android:name="android.intent.action.AppOther_OTHER_ACTIVITY" /> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>运行后,效果图如下:
TaskAffinity应用图 点击按钮,启动OtherActivity图 按下home键后,再次TaskAffinity图
从上述示例,可以得知,android:allowTaskReparenting="true",对于Activity的作用了。
Android launchMode 笔记---taskAffinity属性和Intent标记体会,,5-wow.com
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。