android - AMS及相关概念、唤醒崩溃

Android是基于Linux的一个操作系统,它可以分为五层,下面是它的层次架构图

《android - AMS及相关概念、唤醒崩溃》

Android的五层架构从上到下依次是应用层,应用框架层,库层,运行时层以及linux内核层。

Linux是基于C的,而Android是基于Java的(当然底层也是C)。所以这里就会fork出一个Zygote Java进程用来fork出其他的进程。Zygote进程是所有Java进程的父进程。

《android - AMS及相关概念、唤醒崩溃》

ActivityManagerServices(AMS):

它是一个服务端对象,负责所有的Activity的生命周期,ActivityThread会通过Binder与之交互,而AMS与Zygote之间进行交互则是通过Socket通信

AMS & WMS,应该是app端打交道最多的2个framwork层的service。

ActivityManagerService 是android提供给用于管理Activity运行状态的系统进程。

AMS 主要用于管理Activity之间的交互问题。

核心问题有以下几个:
1.activity 生命周期管理
2.intent是怎么传递数据的。(可能跨进程,以及双向传递)
3.launchmode是怎么使用的。(Task的概念)

AMS 是一个同我们开发的service非常相似的一个service,只不过它的作用是管理activity。

所以AMS是一个进程,并且当开机以后,它就常驻在系统里面,归ServiceManager调度。

AMS:android系统服务,Activity管理的服务端,用于管理activity的各种行为,控制activity的生命周期,派发消息事件,低内存管理等等。实现了IBinder接口,可以用于进程间通信。

ActivityThread:

它也就是我们俗称的UI线程/主线程,它里面存在一个main()方法,这也是APP的真正入口,当APP启动时,就会启动ActivityThread中的main方法,它会初始化一些对象,然后开启消息循环队列(之后总结),之后就会Looper.loop死循环,如果有消息就执行,没有就等着,也就是事件驱动模型(edt)的原理。

ApplicationThread:

它实现了IBinder接口,是Activity整个框架中客户端和服务端AMS之间通信的接口,同时也是ActivityThread的内部类。这样就有效的把ActivityThread和AMS绑定在一起了。

Instrumentation:

这个东西我把它理解为ActivityThread的一个工具类,也算是一个劳动者吧,对于生命周期的所有操作例如onCreate最终都是直接由它来执行的。

AMS与后台杀死

《android - AMS及相关概念、唤醒崩溃》

App在后台久置后,再次从桌面或最近的任务列表唤醒时经常会发生崩溃,这往往是App在后台被系统杀死,再次恢复的时候遇到了问题,而在使用FragmentActivity+Fragment的时候会更加频繁。比如,如果Fragment没有提供默认构造方法,就会在重建的时候因为反射创建Fragment失败而崩溃再比如,在onCreate里面new 一个FragmentDialog,并且show,被后台杀死后,再次唤醒的时候,就会show两个对话框,这是为什么?其实这就涉及了后台杀死及恢复的机制,其中涉及的知识点主要是FragmentActivity、ActivityManagerService、LowMemoryKiller机制、ActivityStack、Binder等一系列知识点。

推荐阅读:

Android后台杀死系列之一:FragmentActivity及PhoneWindow后台杀死处理机制

Android后台杀死系列之二:ActivityManagerService与App现场恢复机制

Android后台杀死系列之三:LowMemoryKiller原理(4.3-6.0)

Android后台杀死系列之四:Binder讣告原理

Android进程保活-自“裁”或者耍流氓

参考:

android activity 管理器AMS—-概述

【凯子哥带你学Framework】Activity启动过程全解析

Binder系列—开篇

    原文作者:Mars-xq
    原文地址: https://blog.csdn.net/sinat_31057219/article/details/73321450
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞