Android Activity四种启动模式

来源:互联网 发布:淘宝联盟推广的优惠券 编辑:程序博客网 时间:2024/06/05 08:03

启动模式:
standard(默认)
singleTop
singleTast
singleInstance

一、模式介绍

1、对于使用standard 模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例
例如A启动A,A再接着启动A,A继续启动A,然后再分别出栈
A-A-A-A back
A-A-A back
A-A back
A back

2、当活动的启动模式指定为 singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。
如:A(standard),B(standard),C(singleTop)
(1) A-B-C 启动B A-B-C-B
(2) A-B-C 启动C A-B-C
(3) A-C-B 启动C A-C-B-C

3、当活动的启动模式指定为 singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
如:A(standard),B(standard),C(singleTask)
(1) A-B-C 启动B A-B-C-B
(2) A-B-C 启动C A-B-C
(3) A-C-B 启动C A-C

4、使用singleInstance ,在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实例的问题
如:A(standard),B(standard),C(singleInstance)
(1) A 启动C A C A,C是两个单独的返回栈
(2) A-C 启动B A-B C A,B在同一个返回栈,C是单独的栈
(3)此时在界面B, back后干掉B,到达返回栈中的B,这个返回栈完了之后才会跳入C.

二、启动设置

(1)注册表中设置<activity android:name=".XXXX" android:launchMode="XXXXX" /> (2)代码中设置Intent intent = new Intent(this,xxx.class);intent.setFlag(XXX);this.startActivity(intent);    Intent.Flag.Activity_new_task(每启动一个activity就会创建一个新的task)    Intent.activity_single_top(android.launchMode="single_Top"效果相同)    Intent_activity_clear_top(android.launchMode="single_Task"效果相同)    Intent_activity_no_history(A-B,启动C,C再启动D,当前Activity栈为ABD)

三、OnNewIntent()

注意:Activity调用OnNewIntent()方法的前提,是栈中已经存在实例,且不是在stantard模式,其他模式都满足不创建的前提下。
Activity第一启动的时候执行onCreate()—->onStart()—->onResume()等后续生命周期函数,也就时说第一次启动Activity并不会执行到onNewIntent(). 而后面如果再有想启动Activity的时候,那就是执行onNewIntent()—->onResart()——>onStart()—–>onResume(). 如果android系统由于内存不足把已存在Activity释放掉了,那么再次调用的时候会重新启动Activity即执行onCreate()—->onStart()—->onResume()。

四、扩展

1、退出activity的方法:
(1)、finish()
(2)、killprocess(Process.mid)
(3)、system.exit()
2、退出整个应用
(1)、制造异常抛出
(2)、主activity为SingleTop模式,退出时到主Activity,在OnNewIntent()方法中,调用finish();
(3)、将activity实例放在集合中,退出时将所有的activity finish()掉。
(4)、t通过广播退出,基类activity注册,退出时发送广播即可
(5)、killprocess(Process.mid)
(6)、system.exit()