9.1 四大组件的运行状态
Android的四大组件中除了BroadcastReceiver意外,其他三种组件都必须在AndroidManifest中注册.
在调用方式上,Activity,Service和BroadcastReceiver需要借助Intent,而ContentProvider则无须借助Intent.
Activity是一种展示型组件,用于向用户直接地展示一个界面,并且可以接收用户的输入信息从而进行交互.
Service是一种计算型组件,用于在后台执行一系列计算任务,需要灵活采用stopService和unBindService这两个方法才能完全停止一个Service组件.
BroadcastReceiver是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息.
9.2 Activity的工作过程
startActivity方法有好几种重载方式,但它们最终都会调用startActivityForResult方法.
ApplicationThread是ActivityThread的一个内部类,在Activity的启动过程中发挥着很重要的作用.
在ActivityManagerNative中,AMS这个Binder对象采用单例模式对外提供,Singleton是一个单例的封装类,第一次调用它的get方法时它会通过create方法来初始化AMS这个Binder对象.
checkStartActivityResult的作用就是检查启动Activity的结果,当无法正确地启动一个Activity时,这个方法会抛出错误信息.
Activity的启动过程在ActivityStackSupervisor和ActivityStack之间的传递顺序
performLaunchActivity这个方法主要完成了如下几件事
1.从ActivityClientRecord中获取待启动的Activity的组件信息.
2.通过Instrumentation的newActivity方法使用类加载器创建Activity对象.
3.通过LoadedApk的makeApplication方法来尝试创建Application对象.
4.创建ContextImpl对象并通过Activity的attach方法来完成一些重要数据的初始化.
5.调用Activity的onCreate方法
9.3 Service的工作过程
Service分为两种工作状态,一种是启动状态,主要用于执行后台计算;另一种是绑定状态,主要用户其它组件和Service的交互.
通过Context的startService方法即可启动一个Service.
9.3.1 Service的启动过程
从ContextWrapper的startActivity开始
AMS会通过mServices这个对象来完成Service后续的启动过程,mServices对象的类型是ActiveServices,用来辅助AMS进行Service管理的类,包括Service的启动,绑定和停止.
handleCreateService:
首先通过类加载器创建Service的实例.
然后创建Application对象并调用其onCreate.
接着创建ConTextImpl对象并通过Service的attach方法建立二者之间的关系
最后调用Service的onCreate方法并将Service对象存储到ActivityThread中的一个列表中.
9.3.2 Service的绑定过程
主要通过AMS来完成Service的具体绑定过程,bindService方法
AMS会调用ActiveServices的bindServiceLocked方法...最终通过ApplicationThread来完成Service实例的创建并执行其onCreate方法.
9.4 BroadcastReceiver的工作工程
一个是广播的注册过程,另一个是广播的发送和接收过程.
在AndroidManifest文件中静态注册
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="com.example.receiver.LAUNCH">
</intent-filter>
</receiver>
9.4.1 广播的注册过程
静态注册和动态注册
是由PMS(PackageManagerService)来完成整个注册过程.
动态注册的过程是从ContextWrapper的registerReceiver方法开始的.
最终会把远程的InnerReceiver对象以及IntentFilter对象存储起来.
9.4.2 广播的发送和接收过程
当通过send方法来发送广播是,AMS会查找匹配的广播接受者并将广播发送给他们处理.
普通广播,有序广播和粘性广播.
广播发送仍然开始于ContextWrapper的sendBroadcast方法.将事情交给ContextImpl去处理.
在broadcastIntentLocked的内部,会根据intent-filter查找出匹配的广播接收者并经过一些列的条件过滤,最终会将满足条件的广播接收者添加到BroadcastQueue,接着BroadcastQueue就会将广播发送给相应的广播接收者.
9.5 ContentProvider的工作过程
一种内容共享性组件,它通过Binder向其他组件乃至其它应用提供数据,当ContentProvider所在的进程启动时,ContentProvider会同时启动并被发布到AMS中.
ContentProvider启动过程: