详细介绍有关Android启动模式问题

移动开发 Android
一个类的新实例是否可以接受,当已存在的acitity用来处理Android启动模式的时候,intent会引发activity的onNewIntent() 方法。

Android已经转进了Android启动模式,首先当一个已经存在的activity处理新的intent的时候,用户不能按BACK键后退了,这都是一些自己总结出来的成果,欢迎大家学习参考。

不同程序的Android启动模式可以共享一个affinity;同一个程序的activity可以使用不同的afninity。afninity在符合以下2个条件的时候启动:当启动acitity的Intent中含有FLAG_ACTIVITY_NEW_TASK 节点,或者一个activity的allowTaskReparenting 属性设置为"true"。

之前提到,任务的默认通过startActivity(). 激活的默认activity也和其他activity在一个堆栈里面。但是引发这个activity的Intent通过startActivity() 方法传递了 FLAG_ACTIVITY_NEW_TASK 节点。望文知意,这个节点表示新的任务。但是,也不一定;如果任务中没有含有此afinity的activity,那么它从默认的activity开始。

allowTaskReparenting 节点如果activity的 allowTaskReparenting 属性设置为 "true", 它就可以脱离开始它的任务,然后通过它的afinity指引,走入下一个任务。例如,假设“旅游软件”有一个activity可以获取指定城市的天气。

这个activity和此程序中的其他activity有同样的afinity(默认的afinity)。并且允许重新转入另外的任务。某个activity开始了天气预报动作,它一开始属于这个任务;但是旅游程序到前台运行的时候,天气预报acivity被分配到旅游程序运行。

如果从用户角度看,一个.apk文件包含许多程序,你必须适当的分配不同的affinity给activitis,哪个任务将包含intent指定要运行的activity:对于 "standard" 和 "singleTop" 模式,启动activity的intent 。

(即调用 startActivity()方法的) —除非intent对象包含FLAG_ACTIVITY_NEW_TASK 节点,如果是的话,会像上个章节描述的一样, Affinities and new tasks,另外一个任务会承载这个activity。

相对的, "singleTask" 和 "singleInstance" 模式使得activity永远在tast的根,他们初始化一个任务,不会融入到其他任务中 。activity是否会有多个实例. "standard" 或 "singleTop"模式的activity可以被示例化多次,属于多个任务,或者一个任务中有多个此activity的实例。

相对的,, "singleTask" 和 "singleInstance" 模式的activities限制为只能有一个实例。因为这些activity在任务的根,这表示,任务也只有一个。同一个任务中是否可以有其他的activity: "singleInstance" 模式的activity所在的任务中不能有其他的activity ,如果启动其他activity。

那么其他activity 会被附加到新的任务(不管新activity的Android启动模式是什么) — 就像intent使用了 FLAG_ACTIVITY_NEW_TASK 标记。在其他方面, "singleInstance" 和 "singleTask"没有什么区别。

其他三种模式允许多个acitvity在同一个任务中。singleTask 的activity必须在任务的根,它可以启动其他设置到该任务的activity。而standard" 和 "singleTop"可以用于任务的任何位置。

一个类的新实例是否可以接受、处理其他部分发来的intent: 默认的"standard" 模式可以响应任何新的intent。每个实例处理一个intent。 "singleTop" 模式的activity如果在任务的顶部,则用已有的实例处理所有请求该实例的intent;反之创建一个新的实例,并压入任务的顶部。

例如,一个任务包含根activityA,和其他activityB,C,D,D在任务堆栈的顶部,即堆栈为A-B-C-D. 一个intent请求D。如果D是"standard" Android启动模式,则D的一个新实例被创建,任务堆栈变为A-B-C-D-D. 但是。

如果D的Android启动模式是"singleTop", 则现有的D的实例来响应intent,所以任务堆栈仍然是A-B-C-D. 另外一种情况,如果intent来请求B,如果B是 "standard" 或者 "singleTop" 模式,B都将创建一个新的实例来响应,则任务堆栈为 A-B-C-D-B。

就像上面提到的,"singleTask" 或 "singleInstance" 的activity只有1个实例,所以这个实例要处理所有的intent。"singleInstance" 的activity永远在任务堆栈的顶部(因为它是任务中的***个activity),所以这个实例处理所有的intent。可能有其他的activity在"singleTask" 的activity的顶部,因此这个实例不会处理intent请求,因此intent的请求会失败;(即使失败,intent也会激活这个程序)

注意:当一个新的activity的实例为了响应intent而创建时,用户可以按BACK键回到上一个状态(上一个activity)。但是当一个已经存在的activity处理新的intent的时候,用户不能按BACK键后退了。

【编辑推荐】

  1. Android应用程序组建原理深入剖析
  2. Android SMS短信服务相关概念简述
  3. PythonAndroid数据库相关代码解读
  4. PythonAndroid安装卸载程序具体操作方法解析
  5. Android应用程序的四个关键点
责任编辑:chenqingxiang 来源: 博客园
相关推荐

2010-02-06 09:45:49

Android属性

2010-03-02 09:13:55

Android手机系统

2010-02-22 13:20:58

Python中文问题

2010-03-09 16:38:22

Linux grub启

2010-03-10 11:26:29

交换机配置

2010-03-03 17:50:45

Android图形界面

2010-02-23 10:32:20

Python 脚本

2009-12-16 10:57:29

VS插件

2010-01-13 13:27:00

C++优化

2010-02-06 16:57:43

Android操作系统

2010-03-05 15:58:11

操作系统Android

2009-12-25 16:51:37

ADO参数

2011-08-02 18:38:19

MySQLINI文件

2010-02-06 15:19:35

2010-03-19 11:07:57

点对点无线桥接模式

2023-12-05 16:01:12

模板方法设计模式算法结构

2010-03-05 16:58:02

Android Mar

2010-02-04 16:43:18

Android 配置问

2010-02-05 18:04:36

Android程序框架

2010-03-25 17:29:00

Nginx配置
点赞
收藏

51CTO技术栈公众号