Android_Activity的启动模式

一.管理Task

       Android管理task和back stack的默认行为:activity 在同一个任务中创建并置于先进后出的栈中。如果这种默认的行为不能满足我们的app设计,如:为一个activity创建一个新任务(而不是在相同的任务中),或者启动activity时直接打开已存在的实例(而不是直接在栈顶创建新实例),又或者在用户离开这个task的时候清空除了栈顶以外的全部activity。Android提供了一些属性和flag让coder来指定管理的方式。

在manifest <activity>标签中的相关属性:

                                                          launchMode

                                                          allowTaskReparenting

                                                          clearTaskOnLaunch

                                                          alwaysRetainTaskState

                                                          finishOnTaskLaunch

 

Intent 也有相关的flag:

                                   FLAG_ACTIVITY_NEW_TASK

                                   FLAG_ACTIVITY_CLEAR_TOP

                                   FLAG_ACTIVITY_SINGLE_TOP

 

        android建议一般的app都不要干涉系统按照默认的方式管理activity和task。如果coder必须指定非默认的管理的方式,最好确定这种效果能符合用户的预期。

 

定义Launch Mode

对<activity> 的launchMode可以指定以下值:

Use Cases Launch Mode
Multiple Instances?
Comments
Normal launches for most activities
"standard"
Yes

默认行为。每次启动一个activity,系统都会在目标task新建一个实例。

Normal launches for most activities
"singleTop"
Conditionally

如果目标activity的实例已经存在于目标task的栈顶,系统会直接使用该实例,并调用该activity的onNewIntent()(不会重新create)

Specialized launches
(not recommended for general use)
"singleTask"
No

在一个新任务的栈顶创建activity的实例。如果实例已经存在,系统会直接使用该实例,并调用该activity的onNewIntent()(不会重新create)

Specialized launches
(not recommended for general use)
"singleInstance"
No

和"singleTask"类似,但在目标activity的task中不会再运行其他的activity,在那个task中永远只有一个activity。

 

SingleTask的例子:浏览器的browser activity设置了SingleTask只运行在它自己的task中,如果Browser的task现在正在后台当中(task B),而我们的app(task A)的正要打开这个activity,这个task就会被直接移到前台接收我们的intent。

返回键只会将界面返回到当前task的下一个activity,所以Task B回到前台后,返回键会先作用在Task B中,直到最后一个activity被弹出,才会回到我们的Task A栈顶的activity。

Android_Activity的启动模式_第1张图片

注意:launchMode能被Intent 的flag覆盖。

二.总结

Activity的启动模式

1. standard   默认标准的启动模式, 每次startActivity都是创建一个新的activity的实例。

                     适用于绝大大数情况
2. singleTop  单一顶部,如果要开启的activity在任务栈的顶部已经存在,就不会创建新的实例,而是调用 onNewIntent() 方法。

                     应用场景: 浏览器书签。 避免栈顶的activity被重复的创建,解决用户体验问题。
3. singletask 单一任务栈 , activity只会在任务栈里面存在一个实例。如果要激活的activity,在任务栈里面已经存在,就不会创建新的activity,而是复用这个已经存在的activity, 调用 onNewIntent() 方法,并且清空当前activity任务栈上面所有的activity

                     应用场景:浏览器activity, 整个任务栈只有一个实例,节约内存和cpu的目的注意: activity还是运行在当前应用程序的任务栈里面的。不会创建新的任务栈。
4. singleInstance  单态 单例模式单一实例,整个手机操作系统里面只有一个实例存在。不同的应用去打开这个activity共享 公用的同一个activity。 他会运行在自己单独,独立的任务栈里面,并且任务栈里面只有他一个实例存在。 

                     应用场景:呼叫来电界面 InCallScreen



你可能感兴趣的:(Android_Activity的启动模式)