四大组件的运行状态
- Activity是一种展示型组件,用于向用户直接地展示一个界面,并且可以接受用户的输入信息从而进行交互。
- Service是一种计算型组件,用于在后台执行一系列计算任务。由于Service组件工作在后台,因此用户无法直接感知到它的存在。
- BroadcastReceiver是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息。BroadcastReceiver同样无法被用户直接感知,因为他工作在系统内部。
- ContentProvider是一种数据共享型组件,用于向其他组件乃至其他应用共享数据。ContentProvider内部的Insert、insert、delete、update和query方法需要处理好线程同步,因为这几个方法是在Binder线程池中调用的。
Activity
-
- startActivity不管 多少种重载方式,最总还是会调用startActivityForResult方法
- ApplicationThread是ActivityThread的一个内部类,(IApplicatonThread这个BInder接口实现了大量和Activity以及Service启动/停止相关的功能),它是继承了ApplicationThreadNative,e而
ApplicationThreadNative
继承了binder并实现了IAplicationThread接口。ApplicationThreadNative的作用和系统为AIDL文件生成的类是一样的。 - 启动Activity实现是由
ActivityManagerNative.getDefault()
的startActivity方法来完成的。而ActivityManagerService继承自ActivitNative,又因为ActivityManagerNative继承自Binder并实现了IActivityManger这个Binder接口,所以AMS是一个Binder
,它是IActivityManager的具体实现 - Activity和Application对象的创建都是
通过Instrumenttion来完成
的,是通过类加载器实现的。 - ContextImpl是Context的具体实现,是通过Activity的attach方法来和Activity建立关联。
Service
- Service分为两种工作状态,一种是启动状态,主要用于执行后台计算;另一种是绑定状态,主要用于其他组件和Service的交互
Service的启动过程
-
- 最终是由于ApplicationThread继承了ApplicationThreadNative.因此只需要看ApplicationThread对Service启动过程的处理,对应着
scheduleCreateService
方法。 - 之后发送消息给Hnadele H实现服务的最总启动。
Service的绑定过程
- 服务的绑定可能是跨进程的,故因此要把ServiceConnection转化为ServiceDispatcher.InnerConnection对象,而ServiceDispatcher的内部内InnerConnection刚好充当BInder的角色。
BroadcastReceiver的工作过程
广播的注册过程
- 静态注册的广播在应用安装时有系统自动完成注册,具体来说是由PMS来完成整个注册过程的,除了广播以外,其他三大组件也都是在应用安装时有PMS解析并注册。
- 动态注册是从ContextWrapper的registerReceiver方法来完成的。
广播发送和接收过程
- 默认情况改下广播不会发送给已经停止的应用。在Android3.1开始种就为Intent添加了两个标记位,分别是
FLAG_INCLUDE_STOPPED_PACKAGES
和FLAG_EXCLUDE_STOPPED_PACKAGES
,用来控制广播是否要对处于停止状态的应用其作用。
ContentProvider的工作过程
ContentProvider的启动过程:启动一个应用时,会进入到main方法,在方法中会创建ActivityThread的示例并创建主席纳称的消息队列。之后会通过
ActivityThread
的attach方法远程调用AMS的attachApplication,并将ApplicationThread对象提供给AMS。然后会调用Aoolication中的bindApplication
方法,实现跨进程见的传输,最后在handleBindApplication中处理并加载ContentProviderContentProvider一般都是单实例,是由
android:multiprocess
属性决定ContentProvider创建过程可分为:
- 创建ContextImpl和Instrumentation
- 创建Application对象
- 启动当前线程的ContentProvider并调用其onCreate方法
- 调用Application的onCreate方法
handleBindApplication
方法会创建Application对象并加载ContentProvider,注意是先加载ContentProvider
,然后调用Application的onCreate方法。