activity生命周期

作者:Gityuan
链接:https://www.zhihu.com/question/41352677/answer/91030381
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

Activity生命周期:

<img src="https://pic2.zhimg.com/4aa93209cbaef5c2a9bbd2003d928641_b.jpg" data-rawwidth="691" data-rawheight="299" class="origin_image zh-lightbox-thumb" width="691" data-original="https://pic2.zhimg.com/4aa93209cbaef5c2a9bbd2003d928641_r.jpg">

这幅图比较清晰,就不细说, 下面我就说说图上没有的吧

(一)Activity与进程的关系


作为应用开发者,接触更多的是Activity/Service/Broadcast/ContentProvider这四大组件以及线程,往往对于进程没有很多的概念,这是google有意为之,除非在AndroidManifest.xml文件中配置android:process属性,否则一般情况下一个App是运行在一个进程中。

在Android系统启动的过程中,便创建好Android上层应用的环境,即Android Runtime,一切的应用都是运行在Android Runtime这个层面之上。而进程对于App来说是完全透明的,在Activity进入生命周期之前,会先创建好进程,可以把进程理解为Activity的载体。一个进程中可以有多个Activity,而一个Activity必须且只能存在一个进程里;进程里可以不存在任何Activity,而Activity不能离开进程而孤立存在。

(二)home键、back键、电源键、进程管理器

一般情况下


按下home键:前台Activity依次回调onPause, onStop;
按下back键:前台Activity依次回调onPause, onStop, onDestroy;
按下电源键:前台Activity依次onPause, onStop;
对于进程管理器,采用的force-stop的方式,也是直接强杀进程,并且连广播都会隔断。

为何我要强调是一般情况呢,
目前android应用市场比较混乱,各种应用商店,各种app,里面不乏有很多让手机后台大量消耗CPU,导致手机卡顿,或者在后台偷偷耗电、跑流量的应用。
针对这些情况,国内各大手机厂商都会针对Android有不同程度的定制与优化。这可能会导致那些一般情况的理论与实际有所不同。

比如系统有L ow Memory Killer(低内存杀手),在手机内存比较紧张时会强杀应用,这也会导致Activity挂了,这是Android自带的机制。对于厂商,比如灭屏杀进程,那么这就可能导致按下电源键,Activity的生命周期就玩完了;另外,现在大多数App,拦截返回键功能,使其与home键效果一致,那么不排除有对返回键的极端优化情形。

(三) 横竖屏切换

在未做任何处理的情况,旋转后,Activity生命周期重新运行:onPause, onStop, onDestroy, onCreate, onStart, onRestoreInstanceState, onResume。

而目前,google版本的碎片化非常严重,而版本迭代快(今年5月份就能看到Android 7.0),在Android不断升级与完善的同时也新增不少功能,这就导致同一个功能也需要变更。
另外,还是前面的说的,对于configchange部分厂商会对其行为定制是完全可能的,屏幕的旋转后重走生命周期是比较卡的一个过程。

(四)launch mode

Activity启动模式有4种:standard、singleTop、singleTask和singleInstance。相关文章也很多,这里简单说下我的理解:

  • standard是默认方式,一个Task中可以有多个相同类型的Activity;
  • singleTop(字面理解单例栈顶),是指task栈顶只会有一个同类型的Activity;
  • singleTask(字面理解单例task),是指不只是栈顶,整个task只会有一个同类型的Activity;
  • singleInstance(字面理解单例实例):不只是整个task只会有一个同类型Activity,而且该task也只有这一个Activity;

对于Activity实例的单例要求是不断加强: standard < singleTop <singleTask < singleInstance

有了这些简单铺垫,再说下题主的问题 onNewIntent()的触发时机是在启动Activity时却不需要创建新的Activity实例的情形下触发。 比如singleTop时,当再次启动task栈顶的Activity会触发;singleTask/singleInstance时,再次启动task的Activity会触发。

另外,对于一般App尽量少用singleTask和 singleInstance模式,可能会影响用户体验。

(五) 结束


建议题主,平时多看看google官方文档,看Android源码,多动手写demo程序,另外,就是学会翻墙。

通过打log来验证,留给有兴趣的不妨试试,finish()方法在onCreate,onStart,onResume等不同地方调用finish()后,Activity走的生命周期也是不同的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值