您的位置:首页 > 移动开发 > Android开发

Android学习笔记----Activity的启动模式

2016-03-02 18:53 295 查看

/*********************************************************************************************************************/

此博客原本是本人学习Android过程中自己所做的学习笔记,在此分享出来供大家学习,因为之前只是个人笔记仅供自己回顾复习,所以笔记里可能借鉴了其他人的一些资料,整理博客的过程中已经忘了资料的来源,所以未做标注,望被鄙人借鉴了资料的原创者们见谅。

/*********************************************************************************************************************/
启动模式

在实际项目中我们应该根据特定的需求为每个活动指定恰当的启动模式。

启动模式一共有四种,分别是:
standard、 singleTop、singleTask 和 singleInstance

可以在 AndroidManifest.xml 中通过给 <activity>标签指定android:launchMode 属性来选择启动模式。

standard

standard 是活动默认的启动模式,在不进行显式指定的情况下,所有活动都会自动使用这种启动模式。Android 是使用返回栈来管理活动的,在 standard 模式(即默认情况)下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于使用standard
模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。



singleTop

当活动的启动模式指定为 singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。不过当该活动并未处于栈顶位置时,这时再启动 该活动,还是会创建新的实例的。



使用场景:比如我在通知栏点击后需要启动一个活动,这个就要用到这个模式,否则的话每次点击都会新建一个活动,你可能说怎么会干这个无聊的事,你不会不代表用户不会,具体的例子,像QQ有新消息到来的时候,同过通知提示新消息,点击通知进入消息展示的Activity。

singleTask

使用 singleTop 模式可以很好地解决重复创建栈顶活动的问题,当活动的启动模式指定为 singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。



使用场景:通常用来退出整个应用程序,将主Activity的启动模式设置为该模式,在需要退出应用的Activity中跳转到主Activity,同时重写主Activity的onNewIntent方法,在里面加上一句finish。

singleInstance

singleInstance 模式应该算是四种启动模式中最特殊也最复杂的一个了,不同于以上三种启动模式,指定为 singleInstance 模式的活动会启用一个新的返回栈来管理这个活动(其实如果 singleTask 模式指定了不同的 taskAffinity,也会启动一个新的返回栈)。

意义:
想象以下场景,假设我们的程序中有一个活动是允许其他程序调用的,如果我们想实现其他程序和我们的程序可以共享这个活动的实例,应该如何实现呢?使用前面三种启动模式肯定是做不到的,因为每个应用程序都会有自己的返回栈,同一个活动在不同的返回栈中入栈时必然是创建了新的实例。而使用singleInstance
模式就可以解决这个问题,在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实例的问题。

实例:浏览器,当在应用程序中调用浏览器的时候,如果浏览器没有打开,则打开浏览器,否则在打开的浏览器中继续访问。



singleTask相关

launchMode为singleTask的时候,通过Intent启动到一个Activity, 如果系统已经存在一个实例,系统就会将请求发送到这个实例上, 但这个时候,系统就不会再调用通常情况下我们处理请求数据的onCreate方法,而是调用onNewIntent方法

/*********************************************************************************************************************/

Activity的onNewIntent()步骤何时会被调用

前提:ActivityA已经启动过,处于当前应用的Activity堆栈中

当ActivityA的LaunchMode为SingleTop时,如果ActivityA在栈顶,且现在要再启动ActivityA,这时会调用onNewIntent()方法

当ActivityA的LaunchMode为SingleInstance,SingleTask时,如果已经ActivityA已经在堆栈中,那么此时会调用onNewIntent()方法

当ActivityA的LaunchMode为Standard时,由于每次启动ActivityA都是启动新的实例,和原来启动的没关系,所以不会调用原来ActivityA的onNewIntent方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息