Activity 加载模式详细说明

 

在minifest.xml中的<activity>元素的launchmode属性可以设置四种不同的加载模式:

“standard”(默认值)

“singleTop”

“singleTask”

“singleInstance”

 

以下表格是纯考虑launchmode设置情况下作出比较

哪个Task把持对intent作出响应的activity Activity是否可以存在多个实例 在实例所在的Task是否会有别的Activity 是否载入新的类实例来处理新的intent
standard
产生intent的任务
可以被多次初始胡,每个实例可以归属于不同的Task 其它Activity可以出现在它所在Task的任意位置 对每个新的intent都会创建新的实例
singleTop 产生intent的任务
可以被多次初始胡,每个实例可以归属于不同的Task 其它Activity可以出现在它所在Task的任意位置 如果Activity处于当前Task堆栈的最顶端,则重用Activity,不需要创建新的实例。否则需要重新创建实例
singleTask 定义的新的task
只有一个实例 是Task的根Activity,可以将其它Activity载入到它所在Task中,并在它的上方 不创建新实例。
如果Activity不在堆栈最顶端,则忽略该Intent并且同时Task被激活,切换至前台。如果在最顶端,那么处理Intent。
singleInstance 定义的新的task
只有一个实例 不存在 不创建新实例。因为它始终在Task的栈顶,因此始终能处理Intent

 

对于launchmode对于Activity生命周期的影响还需要考虑 Intent中的Flag值。

FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
FLAG_ACTIVITY_SINGLE_TOP

如果是FLAG_ACTIVITY_NEW_TASK的标记,对于standard或者singleTop启动模式的activity也会重新新建一个Task。

 

 

 

 

在实际开发中,我们有一个需求,保证某个activity只有一个实例。这里会碰到一个case:

1.start Activity from gallery

2.start other apps until  step1 activity be destroyed by system.

3.start Activity from other app.can start but can't stop the old activity.

4.click gallery. start the old activity by system.

 

这个case里面会产生两个实例。

暂时无解。

你可能感兴趣的:(xml)