安卓四种启动模式的经验总结

来源:互联网 发布:济宁网络问政平台 编辑:程序博客网 时间:2024/04/30 02:33

大家都知道,安卓有四种启动模式,使用的时候在清单文件配置一下就好了。但是如果你对四种启动模式认识不深,后面是要吃大亏的!有些需求场景本来是可以简单实现的,但是却被各自需求逻辑搞复杂。我之前遇到一个问题是,点击手机桌面图标,打开的Activity总是启动页,当时以为是因为我们把启动页这个Activity设置成了LauchActivity导致的,所以我把MainActivity设置成了LauchActivity,导致每次点击桌面图标首先打开MainActivity,然后去启动SplashActivity,这样做是非常消耗内存的,所以我们的项目上线之后在启动页加载广告图的时候造成内存溢出了!后来想想原来是自己对Activity的启动模式和Android任务栈认识不深导致的。
首先,我们点击桌面应用图标,一定打开的是我们设置为LauchActivity的那个Activity,然后在根据业务逻辑进行调转到相应的Activity。当你的SplashActivity的启动模式设置成SingleTask或者SingleInstance启动模式,并且这个Activity还是LauchActivity,那么当你程序退出到后台,再次点击桌面图标,程序打开的还是SplashActivity,而你之前在任务栈还没有调用finish()的Activity,已经因为你设置的启动模式,而强行清栈了!这就是我说的很坑的地方,改动一处,已经影响了之前的业务逻辑。
那么现在我们就要来聊一聊安卓的启动模式了。
这里有比较好的博客可以参考一下:
http://blog.csdn.net/shinay/article/details/7898492/
但是为了加深自己的理解,所以我决定自己做一下实验:
准备材料:安卓开发工具、一个新的项目工程、三个功能相同并打印各种生命周期的Activity.
首先我们看Standard启动模式:它允许Activity重复添加,如果你想让跳转之前的Activity出栈,需要手动的调用跳转之前的Activity的finish()方法。
Activity跳转,不调用之前的Activity的生命周期方法
我们会发现FristActivity的onPause()方法会在SecondActivity调用onCreate()方法之前调用,而onSaveInstanceState()和onStop()会在FristActivity创建之后调用。
SingleTop启动模式
实验场景:1)三个功能相同的Activity,并打印各自的生命周期方法,把SecondActivity设置为SingleTop启动模式。2)我们首先从FristAcitity跳转到SecondActivity,接着跳转到ThirdActivity,然后再从ThirdActivity跳转到FristActivity,再跳SecondActivity来观察SecondActivity的生命周期方法。
实验现象:1)我们会发现每次跳转SecondActivity的生命周期调用和Sandard启动模式是一致的。
2)当我把SecondActivity设置成跳转到当前的显示界面的时候,如下图:
这里写图片描述
点击当前SecondAtivity的跳转按钮,发现调用了SecondActivity的如下生命周期方法:
这里写图片描述
我们发现当SecondActivity设置成SingleTop启动模式的时候,重复跳转到自己,如果自己在栈顶的话,它就不会重新创建自己,而是复用了当前处在栈顶的Activity,并调用onPause()、onNewIntent()、onResume()、onPostResume()四个方法。
为了进行对比,我们现在让FristActivity重复的跳转到自己,打印的生命周期如下:
这里写图片描述
我们会发现Standard启动模式的Activity并没有复用自己,而是重新走了一遍生命周期方法,也说明它是允许Activity叠加的!
3)SingleTop 可以有多个实例,但是不允许多个相同Activity叠加。如果该Activity不在栈顶,则创建新的实例,在栈顶则复用,并调用onNewIntent()方法。这种启动模式通常适用于接受到消息后显示的界面,例如QQ接受到消息后弹出Activity,如果一次来10条消息,总不能一次弹10个Activity。
SingleTask模式
实验场景:1)材料和上面一样,现在我们把SecondActivity设置成SingleTask启动模式,并从1–>2–>3—>1—>2这样进行Activity调转。
实验现象:1)发现正常的从1–>2—>3生命周期方法和Standard启动模式一模一样。
2)当从3–>1–>2Activity进行跳转的时候,SecondActivity调用了如下生命周期方法。
这里写图片描述
我们发现,SingleTask启动的Activity在发现自己在任务栈有实例时,会复用之前的实例,并调用onNewIntent()、onRestart()、onStart()、onResume()、onPostResume()五个生命周期方法。
3)设置SingleTask启动模式的Activity会调用在任务栈上面activity的onDestroy方法,把前面的Activity清出任务栈,直到自己处在栈顶,后面的Activity的位置保持不变。
4)设置SingleTask启动模式的Activity一个任务栈只存在一份实例,这就是它和SingleTop的区别.
5)SingleTask只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
SingleInstance模式
实验场景:1)实验材料和上面相同,我们把SecondActivity的启动模式设置成singleInstance启动模式。
2)在每个Activity的onCreate()方法中加如下代码:

 Log.e(">>>>>>>>>>>>>>>>>"+TAG,"onCreate()"+"TaskId"+getTaskId());

实验现象:1)首先从FristActivity跳转到SecondActivity时我们发现除了onCreate()方法打印的日志不一样外,其他的生命周期方法和Sandard启动模式一模一样,日志打印如下:
这里写图片描述
2)我们再从SecondActivity跳转到ThridActivity,再从ThridActivity跳转到FristActivity,都没有发现什么异常,因为除了SecondActivity,其他Activity都是Sandard启动模式。
3)当我们再从FristActivity跳转到SecondActivity,我们发现设置SingleInstance启动模式的Activity也会复用实例,并调用onNewIntent()、onRestart()、onStart()、onResume()、onPostResume()方法。
这里写图片描述
4)当我回退栈的时候,发现之前创建的Activity都还在任务栈内,我们从1–>2–>3–>1–>2,回退栈的时候顺序是2–>1–>3–>1,发现之前的实例在第一次退栈的时候销毁了,所以,任务栈没有SecondActivity的实例。
5)SingleInstance和SingleTask的区别就是它实例存在于独立的一个任务栈中,并跳转复用实例的时候不会清之前存在于任务栈的Activity实例。
6)SingleInstance启动的Activity允许不同的应用进程访问,否则调用将无效。比如:第三方推送跳转时,跳转的Activity必须设置成SingleInstance启动模式,否则无法打开。
最后,我们总结一下:
1)Standard模式允许Activity重复叠加。
2)SingleTop 可以有多个实例,但是不允许多个相同Activity叠加。如果该Activity不在栈顶,则创建新的实例,在栈顶则复用,并调用onNewIntent()方法。这种启动模式通常适用于接受到消息后显示的界面,例如QQ接受到消息后弹出Activity,如果一次来10条消息,总不能一次弹10个Activity。
3)SingleTask只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
4)SingleInstance只有一个实例,并独立使用一个任务栈,不会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。使用场景,A应用需要启动B应用的Activity,则需要把该Activity设置成SingleInstance,比如第三方推送。

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 老百姓打仗了报警派出所不管怎么办 和人打架报案了怎么办 皇上死后的妃子怎么办 武警改制警卫系的学员怎么办 正团病故后住房怎么办 遇到保姆式领导该怎么办 限购房子卖不了怎么办 斑马线礼让行人行人不走怎么办 中国留学生签证在美国被取消怎么办 建行卡网银帐号密码输入错误怎么办 建行卡密码忘了怎么办? 银行卡k宝丢了怎么办 k宝密码锁住了怎么办 农业银行k宝锁了怎么办 银行卡办的网银卡丢了怎么办 事业单位考察档案丢了怎么办 当兵政审家访家里没人在家怎么办 士兵转业结婚材料不全怎么办 体育生训练腿疼怎么办 车底盘刮的严重怎么办 新车底盘被刮了怎么办 车侧面刮凹了怎么办 憋气久了想呕吐怎么办 19岁网贷欠了3万怎么办 大学生欠2w网贷怎么办 当兵去了网贷怎么办 考公安视力不过关怎么办 身份证号和姓名电话泄露了怎么办 黑色裙子被染色了怎么办 戴墨镜鼻子太塌怎么办 戴墨镜鼻子有印怎么办 戴眼镜鼻梁塌了怎么办 站的时间长了腿疼怎么办 小孩腿筋拉伤了怎么办 走多了小腿骨疼怎么办 走多了一个腿疼怎么办 走太多路腿酸痛怎么办 老年人脚肿并痛怎么办 孩子蛙跳肌后大腿痛怎么办 走路久了腿酸怎么办 走路多了膝盖痛怎么办