Activity的启动过程
通过显示调用startActivity方法,startActivity方法有好几种重载方法,但它们最终会调用startActivityForResult方法。
Instrumentation.execStartActivity
Activity由ActivityManagerNative.getDefault来启动,又转移到了AMS中。
AMS的startActivty方法
在最后一个方法中,IApplicationThread继承了IInterface接口,所有它是一个Binder类型的接口,IApplicationThread声明的接口中包含了大量启动,停止Activity的接口方法;
IApplicationThread这个Binder接口的实现者完成了大量和Activity以及Service启动/停止相关的功能;而它的实现者就是ActivtyThread中的内部类ApplicationThread;
ApplicationThread通过scheduleLaunchActivity方法来启动Activity,在这个方法中就是通过发送一个启动Activity的消息交由Handler处理,这个Handler有着一个和简洁的名字H;
Handler H对LAUNCH_ACTIVITY这个消息进行处理,Activity的启动过程由ActivityThread的handleLaunchActivity方法来实现,在其中performLaunchActivity方法最终完成了Activity对象的创建和启动过程;并且ActivityThread通过handleResumeActivity方法来调用被启动Activity的onResume这一生命周期方法。
Service的工作过程
Service分为两种工作状态,一种是启动状态,主要用于执行后台计算;另一种是绑定状态,主要用于其他组件和Service的交互。
Context.startService方法可启动一个Service
Context.bindService方法可以以绑定的方式启动一个Service
Service的启动过程:
从ContextWrapper的startService开始,然后进入ContextImpl的startService
接着通过AMS来启动服务,是一个远程调用过程,AMS.startService;
最后是ApplicationThread对Service进行启动,调用scheduleCreateService方法
和Activity的启动过程类似的,都是通过发送消息给Handler H 来完成的。H会接收这个CREATE_SERVICE消息并通过ActivityThread的handleCreateService方法来完成Service的最终启动。
Service的绑定过程:
从ContextWrapper的bindService开始,然后进入ContextImpl的bindService
AMS.bindService
最后调用ApplicationThread的ScheduleBindService方法,内部通过Handler H来中转的。
在H内部,接收到BIND_SERVICE消息后,会交给ActivityThread的handleBindService方法来处理。
BroadcastReceiver的工作过程
定义广播接收者
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context,Intent intent){
String action = intent.getAction();
}
}
注册广播接收者,在AndroidManifest文件中静态注册,也可以通过代码动态注册
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name=""/>
</intent-filter>
</receiver>
//动态注册的广播需要在合适的时机进行解注册,解注册采用unregisterReceiver
IntentFilter filter = new IntentFilter();
filter.addAction();
registerReceiver(new MyReceiver,filter);
Intent intent = new Intent();
intent.setAction();
sendBroadcast(intent);
1.广播的注册过程
静态注册的广播在应用安装的时由系统自动完成注册,具体来说是PMS(PackageManagerService)来完成整个注册过程。
动态注册从ContextWrapper.registerReceiver方法开始的,然后将注册过程交给了ContextImpl.registerReceiver方法;
注册广播的真正实现过程是在AMS中,走进AMS.registerReceiver方法。
2.广播的发送和接收过程
广播的发送开始于ContextWrapper的sendBroadcast方法,然后交给ContextImpl的sendBroadcast方法,接着它直接向AMS发起了一个异步请求用于发送广播。
ContentProvider的工作过程
当一个应用启动时,入口方法为ActivityThread的main方法,main方法是一个静态方法,在main方法中会创建ActivityThread的实例并创建主线程的消息队列,然后在ActivityThread的attach方法中会远程调用AMS的attachApplication方法并将ApplicationThread对象提供给AMS。ApplicationThead是一个Binder对象,它的Binder接口是IApplicationThread,它主要用于ActivityThread和AMS之间的通信。
可以简单认为ContentProvider都是单实例的,android:multiprocess为false;
在AMS中,首先会启动ContentProvider所在的线程,然后再启动ContentProvider。
ActivityThread的handleBindApplication则完成了Application的创建以及ContentProvider的创建,分为如下步骤:
1、创建ContextImpl和Instrumentation
- 创建Application对象
3.启动当前线程的ContentProvider并调用其onCreate方法
4.调用Application的onCreate方法