您的位置:首页 > 其它

Activity的任务堆栈学习笔记(一)

2011-03-08 14:35 302 查看
from:http://1.j2medev.com/bbs/forumdisplay.php?fid=49

Activities and Tasks
1,activity 用任务来组成堆栈。堆栈里可以有别的应用里的activity 。
2,用户感知一个应用不是看开发包,是看任务堆栈。一个任务堆栈对用户来说就是一个应用。
3,任务堆栈只对activity做入栈,弹出操作。
4,任务堆栈只能设置一个值:偏好。
5,任务堆栈中的activity是作为一个整体停留在前台或者后台。
6,任务堆栈和其中的activity的行为可以靠启动该activity的intent的标志位和AndroidManifest.xml文件里<activity>的属性信息来控制。

Affinities and new tasks
1,应用程序里的每一个activity都有自己的偏好,默认情况下,应用程序里的activity有一样的偏好,他们在一个任务堆栈里。可以通过<activity>标签的taskAffinity 属性来

设置偏好。一个应用程序中可以设置不同的偏好。偏好也可以跨应用程序,不同的应用程序可以用同一个偏好。偏好在两种环境下生效:intent使用FLAG_ACTIVITY_NEW_TASK标志

位,或者activity的allowTaskReparenting(同意任务重排根目录)属性设置成true。
2,默认的情况:startActivity()启动的新Activity和调用startActivity()方法的Activity在一个任务堆栈中。

验证
1>.使用FLAG_ACTIVITY_NEW_TASK新建任务堆栈的的堆栈名字,
2>.如果有相同偏好的任务堆栈,里面没有这个Activity是什么情况,如果有这个Activity事什么情况。

验证过程
1>.新建一个Test工程,其中2个activity:main,Activity1。在同一个工程中,
Intent i = new Intent();
i.setClass(main.this, Activity1.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);

或者 i.setAction("com.example.project.BOUNCE");//设置Activity1:<intent-filter><action android:name="com.example.project.BOUNCE" /><category

android:name="android.intent.category.DEFAULT" /></intent-filter>

不管是否添加Intent.FLAG_ACTIVITY_NEW_TASK都在同一个task中。

2>再新建一个YYY工程,其中也有一个同样的Activity1。i.setClass(main.this, Activity1.class);启动的是Test工程中的Activity1。使用i.setAction

("com.example.project.BOUNCE");可以启动YYY工程中的Activity1。添加Intent.FLAG_ACTIVITY_NEW_TASK生效。

3>Test工程不添加FLAG_ACTIVITY_NEW_TASK启动YYY工程的Activity1,和YYY工程启动自己的Activity1互不干扰。
01-02 03:11:42.792: INFO/eee(2658): Test main taskID:::77

01-02 03:11:45.477: INFO/eee(2684): YYYY Activity111 taskID:::77

点home到主界面运行YYY
01-02 03:11:49.692: INFO/eee(2684): YYY main taskID:::78

01-02 03:11:54.272: INFO/eee(2684): YYYY Activity111 taskID:::78

4>.Test工程添加FLAG_ACTIVITY_NEW_TASK。
情况一:先用Test启动YYY工程的Activity1:(没有对应的Task堆栈。)
01-02 03:20:21.032: INFO/eee(2723): Test main taskID:::83
01-02 03:20:24.557: INFO/eee(2781): YYY Activity1 onCreate
01-02 03:20:24.562: INFO/eee(2781): YYYY Activity111 taskID:::86
点home回主界面
01-02 03:20:28.332: INFO/eee(2781): YYY Activity1 onStop
点击YYY工程,这时不是显示的YYY工程的入口Activity,直接显示的是YYY工程的Activity1
01-02 03:20:34.617: INFO/eee(2781): YYYY Activity111 taskID:::86
点击返回键,YYY工程的Activity1被销毁,返回到了主界面
01-02 03:20:49.887: INFO/eee(2781): YYY Activity1 onStop
01-02 03:20:49.887: INFO/eee(2781): YYY Activity1 onDestroy
再点击Test工程看到的是Test工程的入口界面
01-02 03:20:54.207: INFO/eee(2723): Test main taskID:::83
证明,如果使用FLAG_ACTIVITY_NEW_TASK时,没有和新的tsak相同的堆栈,task堆栈被建立且使用FLAG_ACTIVITY_NEW_TASK启动的Activity被置于新建task顶部。这时去运行

和新建task有相同偏好的程序时,点击执行的不是入口Activity,直接显示的是新建task的栈顶Activity。这个现象在系统联系人和短信程序也可验证。先点联系人,在联系人程

序中触发发短信界面。点home,再点短信程序,直接显示的是发短信界面。

情况二:先运行YYY工程的Activity1:(有对应的Task堆栈。)
01-02 03:49:45.547: INFO/eee(2781): YYY main taskID:::90

01-02 03:49:48.367: INFO/eee(2781): YYY Activity1 onCreate

01-02 03:49:48.372: INFO/eee(2781): YYYY Activity111 taskID:::90

点home回主界面
01-02 03:49:56.132: INFO/eee(2781): YYY Activity1 onStop

点击Test工程
01-02 03:49:56.662: INFO/eee(2723): Test main taskID:::87

用Test启动YYY工程的Activity1
01-02 03:50:01.222: INFO/eee(2781): YYY Activity1 onCreate

01-02 03:50:01.232: INFO/eee(2781): YYYY Activity111 taskID:::90

点home回主界面
01-02 03:50:16.822: INFO/eee(2781): YYY Activity1 onStop

点YYY工程
01-02 03:50:19.932: INFO/eee(2781): YYYY Activity111 taskID:::90

点返回键(有2个YYYY Activity111,这时销毁第1个)
01-02 03:50:28.352: INFO/eee(2781): YYYY Activity111 taskID:::90

01-02 03:50:28.542: INFO/eee(2781): YYY Activity1 onStop

01-02 03:50:28.547: INFO/eee(2781): YYY Activity1 onDestroy

再点返回键(销毁第2个)
01-02 03:50:33.537: INFO/eee(2781): YYY main taskID:::90

01-02 03:50:33.742: INFO/eee(2781): YYY Activity1 onStop

01-02 03:50:33.747: INFO/eee(2781): YYY Activity1 onDestroy

再点返回键,回到Test工程入口Activity
01-02 03:50:39.902: INFO/eee(2723): Test main taskID:::87

证明,如果使用FLAG_ACTIVITY_NEW_TASK时,如果有对应的tsak相同的堆栈,使用FLAG_ACTIVITY_NEW_TASK启动的Activity被置于对应task顶部。如果对应task已有一个相同的

Activity,不受影响,生成一个新Activity置于对应task顶部。但是用系统的短信程序到发短信界面,点home到联系人,再发短信,在发短信界面点返回键,就是一个,不是叠加
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: