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

activity的任务堆栈学习笔记二

Activities and Tasks 

1,activity 用任务来组成堆栈。堆栈里可以有别的应用里的activity 。 
2,用户感知一个应用不是看开发包(.apk文件),是看任务堆栈。一个任务堆栈对用户来说就是一 
个应用。 
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 
在一个任务堆栈中。 
3,The FLAG_ACTIVITY_NEW_TASK flag 
     在默认情况下,startActivity()总是和调用者在一个任务堆栈里,但是如果使用了 
FLAG_ACTIVITY_NEW_TASK标志就会在不同的任务堆栈中(发现在一个apk里加上 
FLAG_ACTIVITY_NEW_TASK也会在一个堆栈里,不管要启动的activity是不是设置了不同的偏好)。 
但是如果已经有一个和将要运行的Activity偏好相同的堆栈,就会运行在那个堆栈上,不开辟新 
堆栈。 
4,The allowTaskReparenting attribute 
如果allowTaskReparenting属性设置true。这个Activity就可以从它最初开始的堆栈,移动到 
和它偏好相同的堆栈,当和它偏好相同的堆栈的到前台的时候。比如一个旅游程序里有一个天气预 
报的Activity,在另外一个程序里打开了这个Activity, 当旅游程序被调到前台的时候,那么这 
个天气预报Activity显示在前台。 

注意:如果一个.apk文件的程序里有多个从用户角度看起来像单独应用的观点,应该给每一个观点 
包含的Activity设置不同的偏好。 

Launch modes 
在运行模式在<activity>的launchMode属性设置。可以设置成: 
"standard" (标准模式,默认,“standard”模式总是构造一个新的实例来响应新的intent。见 
Clearing the stack章节最后部分) 
"singleTop" (独享堆栈顶端) 
"singleTask" (独享任务堆栈) 
"singleInstance"(单例) 
从4点区分这4种模式: 
1) 什么样的任务堆栈接受要启动的activity。 
在standard和singleTop模式,除非是使用FLAG_ACTIVITY_NEW_TASK标志位,否则要启动的 
activity总是在启动它们的堆栈中。singleTask和singleInstance模式一旦存在了一个堆栈中, 
就不再运行在其他堆栈。 
2) 是否可以有多个实例。 
standard和singleTop模式,可以有多个实例,可以多个实例分属多个任务堆栈,也可以在一个 
任务堆栈中有多个实例。singleTask和singleInstance模式只有一个实例。 
3) 是否同意有其他的activity实例在他们的任务堆栈中 
singleInstance模式一直保持只有自己一个activity在它的任务堆栈中。如果它启动了其他 
activity,那个activity在其他的堆栈中,不管是否加了FLAG_ACTIVITY_NEW_TASK标志。其他 
方面singleInstance和singleTask相同。 
其余的三种模式可以允许在自己的堆栈中有多个activity。singleTask模式一直保持着自己是这 
个任务堆栈的根activity(最底部,不过没有验证到它一直在最底部)。 
4) 当被Intent启动时,是否会生成一个新实例。 
Standard模式会每次都生成一个新实例。每个实例对应一个Intent。 
singleTop模式:如果要启动的activity在目标堆栈的顶部,就不新实例化使用现有的activity 
(但这个会触发onNewIntent(Intent intent)事件)。如果不在顶部,那么就新实例化一个放在 
堆栈顶部。 
"singleTask" 和 "singleInstance"模式,不生成新的实例来处理Intent。 "singleInstance" 
模式一直在它自己的Task堆栈中,所以它一直在堆栈的顶部,它一直能响应到新的Intent。但是 
singleTask模式,允许别的activity在它的堆栈里,如果它在堆栈的顶部,他就可以响应新到的 
Intent。如果它不在堆栈的顶部,那么新到的Intent会调用失败,虽然会调用失败但是singleTask 
模式所在得堆栈还是会被整体调到前台。 
注意:1.当已存在的activity去响应新的Intent的时候,不实例化新的activity,但现有的 
activity的onNewIntent()方法会被调用。要找回最初启动它的Intent可以用getIntent() 
方法。 
2.如果没有实例化一个新的activity,点返回键,多个任务堆栈都会更改状态。比如A-B-C,C启 
动了D,在和另外一个堆栈E-F-D共享一个D,点返回键结束D,变成A-B-C和E-F。 
Clearing the stack 
如果用户离开一个任务堆栈很长时间,系统会自动清除所有的activity,除了根activity。当用 
户返回的时候,就像用户自己不用了该任务堆栈一样,只有最开始的activity呈现出来。这样做 
的思想是:很长时间以后用户会忘记之前他打开这个任务堆栈做什么的了,再返回的时候,是去开 
始做其他事情了。这是默认行为,但也有一些属性会改变默认行为。 
alwaysRetainTaskState属性: 
如果一个任务堆栈的跟activity设置这个属性是TRUE,那么在这个任务堆栈中的所有activity 
会被保留,不会在很长时间以后自动清除。 
clearTaskOnLaunch属性: 
和alwaysRetainTaskState属性相反,如果这个属性设置成TRUE,不保持任务堆栈的状态,每当 
用户点击程序运行,都会把任务堆栈全部清空再重新开始(经验证:跟activity也会被清空,清 
空后新运行的任务堆栈ID不变。) 
finishOnTaskLaunch属性: 
和clearTaskOnLaunch一样,不过这个属性是作用在单独的activity上不是整个任务堆栈上。 
当这个任务堆栈再次运行的时候,finishOnTaskLaunch设置成TRUE的activity会被清除,其他 
activity保持不变。 
另一种强行清除activity的方法是在Intent中加上FLAG_ACTIVITY_CLEAR_TOP标志,目标堆栈 
如果存在Intent将要启动的activity,那么目标堆栈在这个activity之上的activity都会被 
清除。如果这个activity的运行模式是“standard”,它本身也会被清除,再重新构造一个这个 
activity的新实例来响应Intent。因为“standard”模式总是构造一个新的实例来响应新的 
intent。 
Starting tasks 
一个activity使用android.intent.action.MAIN和android.intent.category.LAUNCHER的 
Intent Filters来表示它是一个任务的入口。这样,在程序运行管理器会建立这个任务的图标。 
这代表了2点:1,用户可以通过它运行任务2,在一段时间以后,用户可以返回它。 
重要的是第2点。用户必须能够离开和返回任务。因此,singleInstance和singleTask应该和 
MAIN ,LAUNCHER过滤器一起使用,因为这两种模式的activity总是初始化一个任务。假设,如 
果没有MAIN ,LAUNCHER过滤器,还使用了singleTask模式的activity开始了一个新任务,用 
户在这个任务上操作了一些东西,然后点了home键,任务现在被调到了后台看不到了。但是它又 
不能在程序运行管理器中启动这个任务,用户没办法回到这任务了。 
需要同样小心的是FLAG_ACTIVITY_NEW_TASK标志。使用这个标志开启了一个新任务用户点home 
离开的时候要保证有一种导向让用户可以从新回到这个任务。一些实体总是开始新的任务比如 
notification manager。notification manager总是加带FLAG_ACTIVITY_NEW_TASK标志去启 
动activity。如果你有一个activity使用这个标志区调用一个外部的任务,注意用户有一个独立 
的途径返回到这个任务。 
你不想让用户启动一个程序的时候看到一个activity,可以使用finishOnTaskLaunch标志。

相关文章:

  • Android 简史
  • android textview 中超出屏幕宽度的字符 省略号显示
  • 【原创·视频·教程】大话优酷、酷六类视频网站Android端软件开发
  • Android线程相关
  • 横竖屏切换时候activity的生命周期 android:configChanges
  • 以Dialog形式显示Activity
  • Android面试题
  • Windows下JNI生成头文件
  • Android如何改变模拟器大小
  • Eclipse安装SVN插件
  • Eclipse中LogCat不显示
  • 标签/TabActivity 深度研究
  • 经典——Android 布局
  • Android 图像渐变特效
  • 动态加载XML,以及重写Layout控件
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • ES6核心特性
  • express如何解决request entity too large问题
  • JDK9: 集成 Jshell 和 Maven 项目.
  • js递归,无限分级树形折叠菜单
  • k8s如何管理Pod
  • mysql 数据库四种事务隔离级别
  • SQL 难点解决:记录的引用
  • Terraform入门 - 1. 安装Terraform
  • WebSocket使用
  • 从PHP迁移至Golang - 基础篇
  • 服务器从安装到部署全过程(二)
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 树莓派 - 使用须知
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 再谈express与koa的对比
  • Python 之网络式编程
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • # 计算机视觉入门
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #pragma once
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (第二周)效能测试
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net 获取url的方法
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET企业级应用架构设计系列之技术选型
  • .NET轻量级ORM组件Dapper葵花宝典
  • .NET中的Exception处理(C#)
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [].slice.call()将类数组转化为真正的数组