从源码的角度理解四大组件的工作过程——Android开发艺术探索笔记

Posted Spark_Yuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从源码的角度理解四大组件的工作过程——Android开发艺术探索笔记相关的知识,希望对你有一定的参考价值。

原文链接http://sparkyuan.me/2016/03/14/四大组件的工作过程/ 转载注明出处

系统对四大组件的过程进行了很大程度的封装,日常开发中并不需要了解底层的工作原理,那么研究这些原理的意义在哪里呢?

  • 如果你想在技术上更进一步,那么了解一些系统的工作原理是十分必要的,也是开发人员日后成长为高级工程师所必备的技术能力。
  • android作为一个优秀的基于Linux操作系统,其内部一定有很多值得我们学习的地方,通过对Android操作系统的学习对提高开发人员的内功有很大的好处。
  • 如果你从事Android Rom开发,那就没什么好说的了,看源码吧。

本文侧重于对四大组件工作过程的分析,通过分析他们的工作过程理解系统内部运行机制,加深我们对Android整体系统结构的认识。

本文中的UML图来自@amurocrash,感谢amurocrash。
Android相关部分的源码实在是太多,全部贴上了太过繁琐,所以借用了amurocrash同学的UML图使得整个流程更加容易理解。

四大组件的运行状态

  • Activity的主要作用是展示一个界面并和用户交互,它扮演的是一种前台界面的角色。
  • Service是一种计算型组件,用于在后台执行一系列计算任务。Service有两种状态:启动状态和绑定状态。启动状态时的Service不需要与外界交互,绑定状态的Service可以方便的和Service组件进行通信。Service是运行在主线程中的,因此耗时的后台计算仍然需要在单独的线程中去完成。灵活采用stopService和unBindService这两个方法才能完全停止一个Service组件。
  • BroadcastReceiver是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息。广播注册有静态和动态两种方式,动态注册通过Context.registerReceiver()来实现,不需要时通过Contex.unRegisterReceiver()来解除广播,这种方式必须要应用启动才能注册;静态注册则在AndroidManifest文件中进行,应用安装时会被系统解析,不需要启动应用就可接收广播。匹配过程是通过来描述的。
  • ContentProvider是一种共享型组件,用于向其他组件乃至其他应用共享数据。它内部维持着一份数据集合,并需要实现增删改查这四种操作,这个数据集合既可以通过数据库来实现,也可以采用其他类型来实现,比如List,Map等。需要注意的是,增删改查要处理好线程同步,这几个方法是在Binder线程池中被调用的,另外,ContentProvider不需要手动停止。

Activity的工作过程

UML图

  • 启动Activity的真实实现是由ActivityManagerNative.getDefault().startActivity方法来完成的。这个方法返回ActivityManagerService。
  • ActivityManagerService(AMS)继承自ActivityManagerNative,而ActivityManagerNative继承自Binder并实现了IActivityManager这个Binder接口,因此AMS也是一个Binder。
  • AMS这个Binder对象采用单例模式对外提供,第一次调用它的get方法时会通过create方法初始化,后续调用中直接返回之前创建的对象。
  • 从makeApplication的实现可以看出,如果Application已经被创建过了,那么就不会再重复创建,这也意味着一个应用只有一个Application对象。Application的创建也是通过Instrumentation来完成的,这个过程和Activity对象的创建过程一样,都是通过类加载器来实现的。
  • ContextImpl是Context的具体实现,ContextImpl是通过Activity的attach方法来和Activity建立关联的,在attach方法中Activity还会完成Window的创建并建立自己和Window的关联,这样当Activity接受到事件就可以传递给window了。

Service的工作过程

启动过程

启动过程

绑定过程
这里写图片描述

- Service有两种状态:启动状态和绑定状态,两种状态是可以共存的。

BroadcastReceiver的工作过程

BroadcastReceiver的工作过程包括广播注册过程、广播发送和接收过程。
动态注册
这里写图片描述

发送接收
这里写图片描述

注:

  • 静态注册是由PackageManagerService(PMS)在应用安装的时候完成整个注册过程的,除广播以外,其他三大组件也都是在应用安装时由PMS解析并注册的。
  • 广播的发送有几种类型:普通广播、有序广播和粘性广播,有序广播和粘性广播与普通广播相比具有不同的特性,但是发送和接收过程是类似的。
  • FLAG_INCLUDE_STOPPED_PACKAGES:广播会发送给已经停止的应用,FLAG_EXCLUDE_STOPPED_PACKAGES广播不会发送给已经停止的应用
  • 从Android 3.1开始,处于停止状态的应用无法接受到开机广播。

ContentProvider

启动过程

这里写图片描述

  • 当ContentProvider所在的进程启动时,会同时被启动并被发布到AMS中,需要注意的是,这个时候它的onCreate要先去Application的onCreate执行,这在四大组件中是一个少有的现象。
  • 用启动的入口为ActivityThread的main方法,main方法会创建ActivityThread实例并创建主线程消息队列。
  • attach方法中远程调用AMS的attachApplication方法,并提供ApplicationThread用于和AMS的通信。
  • attachApplication方法会通过bindApplication方法和H来调回ActivityThread的handleBindApplication,这个方法会先创建Application,再加载ContentProvider,然后才会回调Application的onCreate方法。
  • ContentProvider的multiprocess属性决定了ContentProvider是否是单例(false时),一般都用单例。
  • ontentResolver的具体类是ApplicationContentResolver,当ContentProvider所在进程未启动时,第一次访问它会触发ContentProvider的创建以及进程启动。

Query流程

这里写图片描述

insert,delete和update方法类似,这里就不在分析了。

原文链接 http://sparkyuan.me/2016/03/14/四大组件的工作过程/ 转载注明出处

以上是关于从源码的角度理解四大组件的工作过程——Android开发艺术探索笔记的主要内容,如果未能解决你的问题,请参考以下文章

深入源码分析SpringMVC执行过程

Android 四大组件 - bindService 的通信过程

基于android10.0源码分析Activity的启动流程

基于android10.0源码分析Activity的启动流程

第九章:四大组件的工作过程

-四大组件的工作过程读书笔记