此篇短文是介绍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的相关细节,会定期总结一些东西和大家分享。
共同学习,写下你的评论
评论加载中...
作者其他优质文章