多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
我指的不是framework层的东西,而是最基础的Activity生命周期。 * 按下home、back、电源键、进程管理器效果? * 横竖屏、输入键盘、ScreenSize? * onSaveInstanceState和onRestoreInstanceState执行时机? * SingleTop、SingleTask、SingleInstance方式时的onNewIntent()? 最近在复习,好像不同的手机系统和版本,有不同的生命周期,越来越晕乎了。 原文出处:链接:https://www.zhihu.com/question/41352677/answer/91030381 关于Activity生命周期,对于网上也有大量博客讲到这个问题, Activity生命周期: ![](https://pic1.zhimg.com/50/4aa93209cbaef5c2a9bbd2003d928641_hd.jpg?source=1940ef5c) 这幅图比较清晰,就不细说,**下面我就说说图上没有的吧** **(一)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走的生命周期也是不同的。