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

大家都知道,安卓有四种启动模式,使用的时候在清单文件配置一下就好了。但是如果你对四种启动模式认识不深,后面是要吃大亏的!有些需求场景本来是可以简单实现的,但是却被各自需求逻辑搞复杂。我之前遇到一个问题是,点击手机桌面图标,打开的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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值