1.四大组件的运行状态
Android中的四大组件除了BroadcastReceiver之外,其他三大组件都必须在Manifest里面注册,对于BroadcastReceiver来说,它既可以在Manifest里面注册,也可以通过代码来注册。
在调用方式上面,Activity,Service,BroadcastReceiver需要借助Intent,而ContentProvider则无需借助Intent。
Activity是一种展示型组件,用于向用户直接地展示一个界面,并且可以接收用户的输入信息从而进行交互。
Service是一种计算型组件,用于在后台执行一系列计算任务。Service有两种状态,启动状态和绑定状态。当处于启动状态的时候,Service内部可以做一些后台计算,而且不需要和外界有直接的交互。当处于绑定状态的时候,Service内部同样可以做一些后台计算,但是处于这种状态时外界可以很方便地和Service组件进行通信。
注意:尽管Service组件是执行后台计算的,但是它本身是运行在主线程中的,因此耗时的后台计算仍然需要在单独的线程中去完成。
BroadcastReceiver是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息。由于BroadcastReceiver的特性,它不适合用来执行耗时操作,BroadcastReceiver组件一般来说不需要停止,也没有停止的概念。
ContentProvider是一种数据共享型组件,用于向其他组件乃至其他应用共享数据。它的内部需要实现增删改查这四种操作,在它的内部维持着一份数据集合,这一个数据集合既可以通过数据库来实现,也可以采用其他任何类型来实现,比如List和Map,ContentProvider对数据集合的具体实现并没有任何要求。
注意: ContentProvider内部的insert,delete,update,query方法需要处理好线程同步,因为这几个方法是在Binder线程池中被调用的,另外ContentProvider也不需要手动停止。
2.Activity的工作过程
Activity真正的启动是调用ActivityManagerService的startActivity方法。
AMS中转移到ActivityStackSupervisor的startActivityMayWait方法。
Activity的启动在ActivityStackSupervisor与ActivityStack之间的传递顺序
最终由ApplicationThread的scheduleLaunchActivity方法来启动Activity。发送一个启动Activity的消息交给Handler处理,Handler的名字叫H。
最终Activity的启动过程由ActivityThread的handleLaunchActivity方法实现,最后调用performLaunchActivity方法。
private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
...
if (localLOGV) Slog.v(
TAG, "Handling launch of " + r);
// Initialize before creating the activity
WindowManagerGlobal.initialize();
Activity a = performLaunchActivity(r, customIntent);
if (a != null) {
r.createdConfig = new Configuration(mConfiguration);
Bundle oldState = r.state;
handleResumeActivity(r.token, false, r.isForward,
!r.activity.mFinished && !r.startsNotResumed);
...
}
...
}
通过handleResumeActivity方法来调用被启动Activity的onResume这一生命周期方法。
performLaunchActivity方法主要完成了以下几件事:
2.1.从ActivityClientRecord中获取待启动的Activity组件信息;
2.2.通过Instrumentation的newActivity方法使用类加载器创建Activity对象;
2.3.通过LoadedApk的makeApplication方法来尝试创建Application对象;
2.4.创建ContextImpl对象并通过Activity的attach方法来完成一些重要数据的初始化;
2.5.调用Activity的onCreate方法.
3.Service的工作过程
Service分为两种工作状态,一种是启动状态,主要是用于执行后台计算,另一种
是绑定状态,主要用于和其他组件和Service的交互。需要注意的是,Service的
这两种状态是可以共存的,即Service既可以处于启动状态,也可以同时处于绑定
状态。
3.1.Service的启动过程
3.2.Service的绑定过程
4. BroadcastReceiver的工作过程
4.1.广播的注册过程
广播的注册分为静态注册和动态注册,其中静态注册的广播在应用安装时由系统自动完成注册,具体来说是由PMS(PackageManagerService)来完成整个注册过程的,除了广播之外,其他三大组件也都是在应用安装时由PMS解析并注册的。
4.2.广播的发送和接收过程
5.ContentProvider的工作过程