taskAffinity和allowTaskReparenting的实例
来源:互联网 发布:新概念英语 软件 编辑:程序博客网 时间:2024/05/17 20:22
为了想弄懂allowTaskReparenting,这几天看太多网上的文章,然后照着文章的实例码了一下,但还是试不出效果,其实归根结底都还是对这概念理解不够透彻。
于是按照自己的想法写了两个demo的应用,终于有点效果,废话不多说,直接看代码。
App1的代码如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.kv.app1"> <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name"> <activity android:name=".App1Act1"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name=".App1Act2" android:taskAffinity="com.kf.app" /> </application></manifest>
public class App1Act1 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.act1); findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(App1Act1.this, App1Act2.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } }); }}
public class App1Act2 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.act2); findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.kv.testme"); startActivity(intent); } }); }}
App2的代码如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.kv.app2"> <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name"> <activity android:name="com.kv.app2.App2Act1"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".App2Act2" android:allowTaskReparenting="true"> <intent-filter> <action android:name="com.kv.testme"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> </application></manifest>
public class App2Act1 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.act1); findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(App2Act1.this, App2Act2.class); startActivity(intent); } }); }}
public class App2Act2 extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.act2); }}
于是操作步骤为:
启动App1,启动了App1Act1,点击进入App1Act2,再点击调用了App2的activity,App2Act2。
adb shell dumpsys activity
结果如下
Task id #13828 TaskRecord{9214ad #13828 A=com.kf.app U=0 sz=2} Intent { flg=0x10000000 cmp=com.kv.app1/.App1Act2 } Hist #1: ActivityRecord{92909d8 u0 com.kv.app2/.App2Act2 t13828} Intent { act=com.kv.testme cmp=com.kv.app2/.App2Act2 } ProcessRecord{2e3f1818 31397:com.kv.app2/u0a1060} Hist #0: ActivityRecord{32b8a59a u0 com.kv.app1/.App1Act2 t13828} Intent { flg=0x10000000 cmp=com.kv.app1/.App1Act2 } ProcessRecord{cd3d52c 31365:com.kv.app1/u0a1059}Task id #13827 TaskRecord{2b4db3e2 #13827 A=com.kv.app1 U=0 sz=1} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.kv.app1/.App1Act1 } Hist #0: ActivityRecord{38e9bc1d u0 com.kv.app1/.App1Act1 t13827} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.kv.app1/.App1Act1 bnds=[21,86][273,371] } ProcessRecord{cd3d52c 31365:com.kv.app1/u0a1059}
结论: App2Act2在名为com.kf.app的Task下面,与App1Act2处于同一个进程。
返回桌面,启动App2,发现App2的Act2Act2被打开了。
dumpsys activity结果如下:
Task id #13832 TaskRecord{3bfe2e7b #13832 A=com.kv.app2 U=0 sz=2} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.kv.app2/.App2Act1 } Hist #1: ActivityRecord{27d7fc u0 com.kv.app2/.App2Act2 t13832} Intent { act=com.kv.testme cmp=com.kv.app2/.App2Act2 } ProcessRecord{31773b5f 32563:com.kv.app2/u0a1060} Hist #0: ActivityRecord{ff9cceb u0 com.kv.app2/.App2Act1 t13832} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.kv.app2/.App2Act1 bnds=[283,86][535,371] }Task id #13831 TaskRecord{2b857498 #13831 A=com.kf.app U=0 sz=1} Intent { flg=0x10000000 cmp=com.kv.app1/.App1Act2 } Hist #0: ActivityRecord{9aac9ff u0 com.kv.app1/.App1Act2 t13831} Intent { flg=0x10000000 cmp=com.kv.app1/.App1Act2 } ProcessRecord{fe537b9 32532:com.kv.app1/u0a1059}Task id #13830 TaskRecord{36e924f1 #13830 A=com.kv.app1 U=0 sz=1} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.kv.app1/.App1Act1 } Hist #0: ActivityRecord{35c8a417 u0 com.kv.app1/.App1Act1 t13830} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.kv.app1/.App1Act1 bnds=[21,86][273,371] } ProcessRecord{fe537b9 32532:com.kv.app1/u0a1059}
可以看到,App2Act2又转移,回到了名为com.kv.app2 的Task里面,而不在com.kf.appTask,点击回退,发现App2的前面一个activity也被启动了。
如果将allowTaskReparenting设置为false呢?接着还是上面的步骤。
启动App1,启动了App1Act1,点击进入App1Act2,再点击调用了App2的activity,App2Act2。
敲dumpsys activity查看结果
Task id #13836 TaskRecord{6be6790 #13836 A=com.kf.app U=0 sz=2} Intent { flg=0x10000000 cmp=com.kv.app1/.App1Act2 } Hist #1: ActivityRecord{500f6ba u0 com.kv.app2/.App2Act2 t13836} Intent { act=com.kv.testme cmp=com.kv.app2/.App2Act2 } ProcessRecord{25b7b253 2602:com.kv.app2/u0a1060} Hist #0: ActivityRecord{212508fe u0 com.kv.app1/.App1Act2 t13836} Intent { flg=0x10000000 cmp=com.kv.app1/.App1Act2 } ProcessRecord{3eb6108d 2550:com.kv.app1/u0a1059}Task id #13835 TaskRecord{c002889 #13835 A=com.kv.app1 U=0 sz=1} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.kv.app1/.App1Act1 } Hist #0: ActivityRecord{34e0fe77 u0 com.kv.app1/.App1Act1 t13835} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.kv.app1/.App1Act1 bnds=[21,86][273,371] } ProcessRecord{3eb6108d 2550:com.kv.app1/u0a1059}
和上面未启动App2时一样的结果,那么点击home退回桌面,如果这个时候启动App2,会是什么样的结果呢?
如下:Task id #13839 TaskRecord{96f96e8 #13839 A=com.kv.app2 U=0 sz=1} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.kv.app2/.App2Act1 } Hist #0: ActivityRecord{314c4e44 u0 com.kv.app2/.App2Act1 t13839} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.kv.app2/.App2Act1 bnds=[283,86][535,371] } ProcessRecord{25b7b253 2602:com.kv.app2/u0a1060}Task id #13838 TaskRecord{23ee2101 #13838 A=com.kf.app U=0 sz=2} Intent { flg=0x10000000 cmp=com.kv.app1/.App1Act2 } Hist #1: ActivityRecord{3980b814 u0 com.kv.app2/.App2Act2 t13838} Intent { act=com.kv.testme cmp=com.kv.app2/.App2Act2 } ProcessRecord{25b7b253 2602:com.kv.app2/u0a1060} Hist #0: ActivityRecord{39af1376 u0 com.kv.app1/.App1Act2 t13838} Intent { flg=0x10000000 cmp=com.kv.app1/.App1Act2 } ProcessRecord{22ad280b 3174:com.kv.app1/u0a1059}Task id #13837 TaskRecord{22388ba6 #13837 A=com.kv.app1 U=0 sz=1} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.kv.app1/.App1Act1 } Hist #0: ActivityRecord{1f089f69 u0 com.kv.app1/.App1Act1 t13837} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.kv.app1/.App1Act1 bnds=[21,86][273,371] } ProcessRecord{22ad280b 3174:com.kv.app1/u0a1059}
有没有发现,App2启动的界面,是App2Act1,所以App2下面的App2Act2没有换到Task为com.kv.app2下面,而是还在com.kf.app下面。
如果App2上,App2Act1界面点击进入App2Act2呢?结果如下:
Task id #13839 TaskRecord{96f96e8 #13839 A=com.kv.app2 U=0 sz=2} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.kv.app2/.App2Act1 } Hist #1: ActivityRecord{4c04c71 u0 com.kv.app2/.App2Act2 t13839} Intent { cmp=com.kv.app2/.App2Act2 } ProcessRecord{25b7b253 2602:com.kv.app2/u0a1060} Hist #0: ActivityRecord{314c4e44 u0 com.kv.app2/.App2Act1 t13839} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.kv.app2/.App2Act1 bnds=[283,86][535,371] } ProcessRecord{25b7b253 2602:com.kv.app2/u0a1060}Task id #13838 TaskRecord{23ee2101 #13838 A=com.kf.app U=0 sz=2} Intent { flg=0x10000000 cmp=com.kv.app1/.App1Act2 } Hist #1: ActivityRecord{3980b814 u0 com.kv.app2/.App2Act2 t13838} Intent { act=com.kv.testme cmp=com.kv.app2/.App2Act2 } ProcessRecord{25b7b253 2602:com.kv.app2/u0a1060} Hist #0: ActivityRecord{39af1376 u0 com.kv.app1/.App1Act2 t13838} Intent { flg=0x10000000 cmp=com.kv.app1/.App1Act2 } ProcessRecord{22ad280b 3174:com.kv.app1/u0a1059}Task id #13837 TaskRecord{22388ba6 #13837 A=com.kv.app1 U=0 sz=1} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.kv.app1/.App1Act1 } Hist #0: ActivityRecord{1f089f69 u0 com.kv.app1/.App1Act1 t13837} Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.kv.app1/.App1Act1 bnds=[21,86][273,371] } ProcessRecord{22ad280b 3174:com.kv.app1/u0a1059}
新建多了一个App2Act2实例。
通过以上的实验,相信对allowTaskReparenting有个印象的加深了吧。
阅读全文
0 0
- taskAffinity和allowTaskReparenting的实例
- android的taskAffinity和allowTaskReparenting的用途
- activity 的属性android:taskAffinity和android:allowTaskReparenting
- activity 的属性android:taskAffinity和android:allowTaskReparenting
- android taskAffinity allowTaskReparenting
- android:taskAffinity && android:allowTaskReparenting
- Activity 的 taskAffinity, allowTaskReparenting, singleTask 属性的应用分析
- taskAffinity与allowTaskReparenting与launchMode之间的联系解读
- activity中与taskAffinity,allowTaskReparenting,启动模式相关的问题
- Activity之taskAffinity属性、allowTaskReparenting属性和Android退出整个应用解决方案
- android中的android:taskAffinity,allowTaskReparenting 等属性
- android:allowTaskReparenting实例
- android:allowTaskReparenting实例
- Activity的LaunchMode和taskAffinity
- Activity的LaunchMode和taskAffinity
- Activity的LaunchMode和taskAffinity
- Activity的LaunchMode和taskAffinity
- Activity的LaunchMode和taskAffinity
- Qual_B:长方形
- 远程仓库的使用
- 数据保存!!!Python 爬取网页数据后,三种保存格式---保存为txt文件、CSV文件和mysql数据库
- iTop系统使用手册
- Hadoop 2.7.4伪分布式安装步骤与排坑
- taskAffinity和allowTaskReparenting的实例
- Android studio NDK编译及so库生成方法讲解
- Java中this关键字
- 严重: Parse Fatal Error at line 2 column 243: 已经为元素 "web-app" 指定属性 "xmlns"。 org.xml.sax.SAXParseExcept
- 数据结构思维 第七章 到达哲学
- 5大算法思想
- 算法 第四版 1.4.14 4-sum
- CTS,GTS,CTS Verifier失败项总结(持续更新)
- Android Butterknife(黄油刀) 使用方法总结