原文地址:

http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

此篇短文是介绍activity是如何被启动的。

有4种模式与Intent对象中的antivity标记一起协同来决定activity被调用时的表现行为。

它们是:

“standard”

“singleTop”

“singleTask”

“singleInstance”

默认方式是“standard”。

下表所示,上述模式被分为两类,“standard”和“singleTop”是一类,“singleTask”和“singleInstance”是一类。一个Activity是“standard”或“singleTop”启动模式,可以被实例化多次。这些实例可以属于任何task并可以位于activity栈的任何位置。典型的例子,调用startActivity()来把它们加载到栈中(除非intent对象包含FLAG_ACTIVITY_NEW_TASK标记,那样的话会选择不同的task---详询taskAffinity属性)。

与此相反(in contast),“singleTask”和“singleInstance”的activity只能启动一个task。它们通常在activity栈的根(root)上,此外(moreover),设备中同一时间只保持唯一的一个activity实例---只有一个这样的栈。

standard”和“singleTop”模式在某一方面也是不同的:一旦有一个新的intent给“standard”activity,一个响应这个intent的新的实例就会被创建。每个实例会处理单独的intent。相似的,一个“singleTop”activity的实例可能也会被创建去处理新的intent。然而,如果目标task已经存在一个此activity的实例在栈顶,这个实例会收到这个新intent(在onNewIntent中回调);新的实例就不会被创建了。在其他情况,举个例子,如果一个已存在的“singleTop”activity实例在目标task 中,但没有在栈顶,或者它在栈顶却没有在目标task中,一个新的实例就会被创建并且推进栈中。

singleTask”和“singleInstance”模式只在一个方面有区别:“singleTask” activity允许其他activity成为task中的一部分 ,并且它通常在task栈的根部,其它activity(必须是“standard”和“singleTop”模式的activity)可以加载到这个栈上。另一方面,“singleInstance”模式的activity不允许任何其它activity加载到这个task栈上。它是这个task中唯一的activity。如果它启动另一个activity,那个activity会被指引到不同的task中,这个行为就像在intent中用FLAG_ACTIVITY_NEW_TASK标记一样。(linc注:通常来说,manifest中用“singleTask”启动模式和在intent中用FLAG_ACTIVITY_NEW_TASK标记的行为是一样的)

用例 启动模式 多个实例? 注释
正常(标准)启动模式(对大部分activity适用) "standard" 默认的。系统通常会在目标task中创建这个activity的新的实例并路由intent给它。
正常(标准)启动模式(对大部分activity适用) "singleTop" 有条件的 如果activity的实例已经存在在目标task的栈顶,系统会通过onNewIntent()方法路由intent给这个实例,而不会去创建一个新的实例。
特殊的启动模式(不推荐在普遍使用) "singleTask" 系统创建这个activity在新的task的栈顶并路由intent给它。然而,如果一个activity的实例已经存在,系统会通过调用onNewIntent()方法路由intent给这个实例,而不会去创建一个新的实例。
特殊的启动模式(不推荐在普遍使用) "singleInstance" 和“singleTask”相同,唯一的差别是系统不会加载其它activity到其保持的task中。这个activity通常是它的的task中唯一的成员。

上表所示,“standard”是默认的模式并适合于绝大部分类型的activity。“singleTop”也是普通的很有用的启动模式对部分类型的activity适用。其它模式,“singleTask”和“singleInstance”模式,不适用绝大多数的应用,因为它们的结果(启动后的行为)在交互模型中对于用户来说是不熟悉的,这与大部分的程序都非常不同。

不论你选择了哪种启动模式,一定要测试activity在启动和使用BACK键在其它activity和task中返回时的可用性。

更多的关于启动模式和它们使用intent标记交互的信息,见Tasks and Back Stack文档。

linc注:我之前写了一篇文章是讨论singleTask和intent的newtask flag行为不一致的,最近正在关注activity的相关细节,会定期总结一些东西和大家分享。

更多相关文章

  1. Android(安卓)Wifi模块分析(三)
  2. Android系统配置数据库注释(settings.db)
  3. android用户界面之按钮(Button)教程实例汇
  4. TabHost与RadioGroup结合完成的菜单【带效果图】5个Activity
  5. Android(安卓)Activity的启动
  6. Android(安卓)任务和回退堆栈---启动任务
  7. Android(安卓)UI开发第十七篇——Android(安卓)Fragment实例(Lis
  8. Android——Activity四种启动模式
  9. 修复Android(安卓)App在开机后入口类被启动两次的bug

随机推荐

  1. apk签名机制与SHA1算法
  2. Android应用开发提高篇(5)-----Camera使用
  3. 当前Android开发人员如何提升岗位竞争力
  4. Android(安卓)UI设计:ViewFlipper使图片循
  5. Android(安卓)自定义progressDialog实现
  6. Android增量升级的方法和原理详细介绍
  7. [android] 记一次软键盘弹起时遮挡EditTe
  8. 解决 Android(安卓)sdk content loader 0
  9. 一个 Android(安卓)任务队列的实现
  10. Android(安卓)Apk反编译得到Java源代码