当前位置: 首页 > news >正文

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

相关文章:

  • activity的任务堆栈学习笔记二
  • Android 简史
  • android textview 中超出屏幕宽度的字符 省略号显示
  • 【原创·视频·教程】大话优酷、酷六类视频网站Android端软件开发
  • Android线程相关
  • 横竖屏切换时候activity的生命周期 android:configChanges
  • 以Dialog形式显示Activity
  • Android面试题
  • Windows下JNI生成头文件
  • Android如何改变模拟器大小
  • Eclipse安装SVN插件
  • Eclipse中LogCat不显示
  • 标签/TabActivity 深度研究
  • 经典——Android 布局
  • Android 图像渐变特效
  • php的引用
  • 【Linux系统编程】快速查找errno错误码信息
  • Apache Spark Streaming 使用实例
  • eclipse的离线汉化
  • fetch 从初识到应用
  • JavaScript异步流程控制的前世今生
  • Java方法详解
  • JS基础之数据类型、对象、原型、原型链、继承
  • Laravel5.4 Queues队列学习
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • REST架构的思考
  • SpriteKit 技巧之添加背景图片
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 从PHP迁移至Golang - 基础篇
  • 实习面试笔记
  • 小程序01:wepy框架整合iview webapp UI
  • 用 Swift 编写面向协议的视图
  • C# - 为值类型重定义相等性
  • # 透过事物看本质的能力怎么培养?
  • (3)llvm ir转换过程
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (solr系列:一)使用tomcat部署solr服务
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (五)关系数据库标准语言SQL
  • (转) Face-Resources
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net mvc部分视图
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .net 简单实现MD5
  • .NET 命令行参数包含应用程序路径吗?
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • ?.的用法
  • @javax.ws.rs Webservice注解
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798