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

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值