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

    技术2022-05-19  22

    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到联系人,再发短信,在发短信界面点返回键,就是一个,不是叠加


    最新回复(0)