[Android]对Activity四种加载模式( launchMode )的理解

很久没有写博客了,今天有空就写一下吧:

Title: 对andorid Activity的四种加载模式( launchMode )的理解


为了提高用户体验,指明一个Activity是否需要新建还是使用现有Activity是很有必要的。

以下是对activity的launchMode 的理解。


设置Activity的启动模式可以通过AndroidManifest.xml文件中的<activity>元素的属性来指定,

<activity android:name="ActivityMain" android:launchMode="singleTask"></activity>

一共有4种模式:
        standard
        singleTop
        singleTask
        singleInstance
        
这4种模式又分两类,standard 和signleTop 属于一类, singleTask和signleInstance属于另一类。

以下分別進行介紹:

1、standard :
standard模式是系统默认的加載模式,Activity在被调用时会创建一个新的实例,所有实例处理同一个Intent对象。
Activity 的实例可以属于任何任务(Task),并且可以位于Activity堆栈的任何位置。
假设有一个activity命名为A1,执行语句:
 startActivity(new Intent(A1.this, A1.class));
后A1将跳转到另外一个A1,也就是现在的栈里面有 A1的两个实例。
按返回键后你会发现仍然是在A1(第一个)里面。
 
2、singleTop:
singleTop 跟standard 模式比较类似,同樣可以属于任何任务(Task),并且可以位于Activity堆栈的任何位置。
唯一的区别就是,当跳转的对象是位于栈顶的activity(应该可以理解为用户眼前所看到的activity)时,
程序将不会生成一个新的activity实例,而是直接跳到现存于栈顶的那个activity实例, 任务会使用当前顶端的Activity实例来处理Intent对象。
换句话说,如果被调用的任务包含一个不在堆栈顶端的 singleTop Activity,
或者堆栈顶端为 singleTop 的Activity的任务不是当前被调用的任务,那么,仍然会有一个新的Activity对象被创建。
拿上面的例子来说,当A1 为 singleTop 模式时,执行跳转后栈里面依旧只有一个实例,如果现在按返回键程序将直接退出。
 
 
3、singleTask:
singleTask模式和后面的singleInstance模式都是只创建一个实例的,即一个任务中只能被实例化一次。棧中可以有其他 activity。
在这种模式下,无论跳转的对象是不是位于栈顶的activity,程序都不会生成一个新的实例(当然前提是栈里面已经有这个实例)。
这种模式相当有用,在以后的多activity开发中, 经常会因为跳转的关系导致“同个页面生成多个实例,这个在用户体验上始终有点不好”,
而如果你将对应的activity声明为 singleTask 模式,这种问题将不复存在。
另外如果一个activity的创建需要占用系统大量的资源(CPU,内存)一般配置这个 Activity 为 singleTask的启动模式。
场景举例,浏览器的activity,Launcher等。
 
 
4、singleInstance:
单一实例启动模式。只有在第一次才创建本activity,其他情况都是复用已存在的activity。
设置为 singleInstance 模式的 activity ,一个任务中只能被实例化一次,不允许其他activity存在于本任务栈,将独占一个task(task可以理解为进程),
即任务的Activity堆栈中如果有这样的Activity,它将是堆栈中的唯一的 Activity,
当前任务收到的 Intent 都由它处理, 由它开启的其他 Activity 将在其他任务中被启动。
独占一个task的activity与其说是activity,倒不如说是一个应用,这个应用与其他activity是独立的,它有自己的上下文activity。
如果activity在整个系统中只允许有一个实例存在,就用 singleInstance.
场景举例:电话拨打界面,Calendar或是DeskClock的闹钟, 收发邮件的Activity, NFC 等。


以上是對launchMode 四种模式的理解,先记录下。

文章還是科普型的,若有空,再以代码实例形式来说明上面这些launchMode 的具体使用,更深入理解,敬请期待.


參考:

http://blog.csdn.net/zhangjg_blog/article/details/10923643
http://blog.chinaunix.net/uid-20665441-id-2995070.html
http://bbs.itcast.cn/thread-80202-1-1.html
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0520/2897.html

猜你喜欢

转载自blog.csdn.net/champwang/article/details/52948269