Android程序员:“如何详解 Activity 的生命周期

**针对这些情况,国内各大手机厂商都会针对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状态变化时,将通过该联系找到客服端的Activ 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 ity,从而将消息或者动作传递应用程序面对的接口:xxxActivity。整个Activity的启动过程大致可以分为以下几个步骤:

  • 发起startActivity(intent)请求

  • AMS接收到请求后,创建一个HistroyRecord对象,并将该对象放到mHistory数组中

  • 调用app.thread.scheduleLaunchActivity()

  • AMS创建ActivityRecord对象,将创建的Activity放入到ActivityRecord,再将其放入到mActivities

  • 发起ActivityonCreate()方法

对应的步骤如下图所示:

最后

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

编码,要有一颗我自己可以搞得定的心,深追其中,专研问题的心。

多写代码!多读源码(RTFS)

关于学习资源:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值