Android程序员:“如何详解 Activity 的生命周期?”问完被怼了...

2020-12-07 11:34:48 浏览数 (1)

最近在知乎上看到一个很基础的问题: 如何详解 Activity 的生命周期?

提问者的情况:

本身在知乎上问这么基础的问题再加上说我们国内的开发水平比美国低,也难怪被所有人喷了。。。

接着,回到正题,关于Activity生命周期,对于网上也有大量博客讲到这个问题,接下来就给大家讲讲Activity的知识:

1.Activity生命周期

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

(一)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有不同程度的定制与优化。这可能会导致那些一般情况的理论与实际有所不同。

比如系统有Low 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走的生命周期也是不同的。

2.基本结构

一个应用程序通常由多个Activity组成,那么在应用程序中肯定需要一个容器来盛放这些Activity,必要时通过该容器找到对应的Activity,并进行相关操作。上一篇文章已经讲过一个应用程序对应一个ActivityThread,所以自然而然地该容器是ActivityThread在负责维护,这个容器叫做mActivities,是一个数组,里面的每一项叫做ActivityRecord,一个ActivityRecord对应一个Activity

以上仅仅是应用级别的管理容器,但是很多场景下,系统需要找到某一个特定的Activity,并下发相关数据比如事件分发。所以还必须在系统层面再维护一个容器,这个容器存放在Activity Manager Service,对应的容器叫做mHistory,对应的每一项叫做HistroyRecord

每个Activity必须依靠在进程中,每个进程对应一个AMS中的ProcessRecord,通过这个ProcessRecord可以找到对应的应用的所有Activity,同时还提供了与Activity联系的接口IActivityThread

所以整个Activity的管理框架如下图所示:

3.Activity启动过程

在Launch Activity时,AMS将对应的HistoryRecord作为token传递到客服端和客服端的Activity建立联系。在AMS中Activity状态变化时,将通过该联系找到客服端的Activity,从而将消息或者动作传递应用程序面对的接口:xxxActivity。整个Activity的启动过程大致可以分为以下几个步骤:

  • 发起startActivity(intent)请求
  • AMS接收到请求后,创建一个HistroyRecord对象,并将该对象放到mHistory数组中
  • 调用app.thread.scheduleLaunchActivity()
  • AMS创建ActivityRecord对象,将创建的Activity放入到ActivityRecord,再将其放入到mActivities
  • 发起ActivityonCreate()方法

对应的步骤如下图所示:

最后

关于题者说的“中国开发者水平比美国低”,国外开发者比较国内开发者的优势其实就是英文,那些技术博客、Android官网、公开课、Google开发者大会视频,我们其实是都可以看到的(VPN是Android开发者必备的),再者,国内这几年的Android技术博客和分享其实是很丰富的。

编码,要有一颗我自己可以搞得定的心,深追其中,专研问题的心。 多写代码!多读源码(RTFS)

关于学习资源:

如果你不知道怎么学习,我这里给大家提供一个方向,进行体系化的学习!

除了上面的学习路线,还给大家整理了一份Android进阶学习资料,主要为安卓相关知识点及面试资料为主,在这个PDF中,通过详解各大互联网公司的 Android 常见面试题为主线,从面试的角度带你介绍必备知识点,以及该知识点在项目中的实际应用。

帮你在现在的基础上,重新梳理和建立 Android 开发的知识体系。无论是你短期内想提升 Android 内功实力,突破自己工作中的能力瓶颈,还是准备参加 Android 面试,都会在这个PDF中有所收获。一些基础不好的,这里也有一份安卓基础资料包,帮助巩固基础。

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。

这里附上针对字节跳动的面试题整理的合集,我们进行了分类,循序渐进,由基础到深入,由易到简。

将内容整理成了五个章节:

计算机基础面试题、数据结构和算法面试题、Java面试题、Android面试题、其他扩展面试题、非技术面试题总共五个章节。

还有一份Android开发相关源码解析,这份Android学习PDF大全真的包含了方方面面了

内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等486页超全面Android开发相关源码精编解析

面试时HR也是不可以忽略的环节,我们经常也会遇到很多关于简历制作,职业困惑、HR经典面试问题回答等有关面试的问题。

有全套简历制作、春招困惑、HR面试等问题解析参考建议。

这些都是我闲暇还会反复翻阅的精品资料。可以有效的帮助大家掌握知识、理解原理。当然你也可以拿去查漏补缺,提升自身的竞争力。

以上内容均放在了开源项目:【github】 中已收录,里面包含不同方向的自学Android路线、面试题集合/面经、及系列技术文章等,资源持续更新中...

0 人点赞