在开发Android客户端的过程中经常会用到四大组件:Activity、Service、ContentProvider、BroadCastReceiver,四大组件的实现都是基于ActivityManagerService实现的,现在简单总结一下四大组件的实现原理
1. Activity
Activity启动流程总结:
IPC调用AMS.startActivity(),最终调用ActivityStack.resumeTopActivityInnerLocked启动Activity,在此方法中分别执行
a. 如果承载目标Activity进程的Activity已经启动
执行scheduleResumeActivity,最终执行Activity的生命周期:onResume
b. 如果承载目标Activity进程的Activity没有启动
执行startSpecificActivityLocked,执行Process.start(…)启动承载目标Activity的进程,接着分别执行
b.1 ActivityThread.performLaunchActivity,最终执行Activity的生命周期:onCreate -> onStart
b.2 ActivityThread.handleResumeActivity,最终执行Activity的生命周期:onResume
启动流程如下:
startActivity(intent);
ActivityManagerNative.getDefault().startActivity //getDefault返回的是代理类ActivityManagerProxy
||Binder
\/
AMS.startActivity //为什么会调用AMS的startActivity:定义startActivity为虚函数是为了允许用基类的指针来调用子类的这个函数
ActivityStack.startActivityLocked
WMS.addAppToken //1. 创建一个AppWindowToken对象
WMS.setAppStartingWindow //2. 为正在启动的Activity组件设置一个启动窗口
ActivityStackSupervisor.resumeTopActivitiesLocked
//3. 从mHistory中逐一取出ActivityRecord(取出下一个准备运行的Activity)
ActivityRecord next = topRunningActivityLocked(null);
//4. 若即将启动的Activity的承载进程已经启动
next.app.thread.scheduleResumeActivity //执行onResume
//5. 若即将启动的Activity的承载进程没有启动
ActivityStackSupervisor.startSpecificActivityLocked
ActivityThread.performLaunchActivity //onCreate -> onStart
SetContentView创建DecorView(DecorView = ContentView(用户需要显示的组件) + 系统其它组件)
ActivityThread.handleResumeActivity //onResume
WindowManager.addView
WindowManagerImpl.addView (将DecorView保存到WindowManagerImpl.mViews,将ViewRootImpl保存到mRoots)
ViewRootImpl.setView (将DecorView保存到ViewRootImpl.mView) //------------------------------1. ViewTree的创建过程
WMS.addWindow //添加窗口
WMS.addWindowToListInOrderLocked(new WindowState()); //将系统中当前所有窗口进行排列
WMS.assignLayersLocked //计算系统中所有窗口的Z轴位置 //----------------2. Activity窗口的添加过程
2. Service
2.1 StartService启动Service
IPC调用AMS.startService(),最终调用ActiveServices.realStartServiceLocked启动Service,在此方法中分别执行
a. scheduleCreateService(…)最终执行onCreate()
b. sendServiceArgsLocked(…)最终执行onStartCommand()
2.2 bindService启动Service
IPC调用AMS.bindService(),最终调用ActiveServices.realStartServiceLocked启动Service,在此方法中分别执行
a. scheduleCreateService(…)最终执行onCreate()
b. requestServiceBindingsLocked(…)最终执行onBind(),IPC调用AMS.publishService(…)最终执行ServiceConnection的onServiceConnected方法
3. ContentProvider
3.1 启动 — onCreate
startActivity后最终会调用ActivityThread.main,最终通过Binder调用到AMS.attachApplicationLocked,在AMS.attachApplicationLocked会分别调用
//List providers = normalMode ? generateApplicationProvidersLocked(app) : null;会获得当前Application在AndroidMainfest.xml注册的所有ContentProvider对应的ProviderInfo
a. ActivityThread.bindApplication,最终执行ContentProvider的6个抽象方法之一:onCreate();(当前Application在AndroidMainfest.xml注册的所有ContentProvider都会执行onCreate启动)
b. ActivityStackSupervisor.attachApplicationLocked,最终会执行Activity的生命周期:调用onCreate、onStart、onResume
3.2 ContentResolver控制ContentProvider所暴露的接口 — getType、insert、query、update、delete
//以getContentResolver().query(…)为例分析
执行getContentResolver()获取ContentResolver作为代理来间接操作ContentProvider以获取数据
PMS会将所有在AndroidMainfest.xml中注册的ContentProvider保存在ArrayMap — ActivityThread.mProviderMap中
然后由uri中的Authority在ActivityThread.mProviderMap中取出对应的ContentProvider对应的IContentProvider,由AIDL机制最终调用ContentProvider.query
4. BroadCastReceiver
4.1 注册
a. 注册广播时会为每一个广播创建一个BroadcastFilter对象
BroadcastFilter.receiverList保存着广播接收器myBroadcastReceiver
BroadcastFilter.mActions记录广播接收器myBroadcastReceiver所有能接收的广播,即IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(“com.example.administrator.readfile.Open”);
b. 将BroadcastFilter添加到IntentResolver的实例化对象AMS.mReceiverResolver的成员变量mFilters中
AMS.mReceiverResolver.mFilters是一个ArraySet
一句话总结:每个被注册的广播都对应一个BroadcastFilter对象,BroadcastFilter对象保存在AMS.mReceiverResolver中
4.2 发送和接收
a. 根据intent从广播解析器AMS.mReceiverResolver中查询符合条件的BroadcastFilter — registeredReceivers
b. 封装BroadcastRecord类实例,其中
BroadcastRecord.queue = queue = broadcastQueueForIntent(intent)
BroadcastRecord.intent = intent = new Intent(“com.example.administrator.readfile.Open”);
BroadcastRecord.receivers = registeredReceivers =AMS.mReceiverResolver.queryIntent(intent, …)
c. 把BroadcastRecord类实例添加到并发的广播序列BroadcastQueue.mParallelBroadcasts中并准备发送
d. 开始发送有序广播和无序广播
e. 从BroadcastQueue.mParallelBroadcasts中取出BroadcastRecord
f. 由BroadcastRecord解析出receiver和intent
receiver = LoadedApk.ReceiverDispatcher.mReceiver = myBroadcastReceiver(在注册广播时ReceiverDispatcher构造函数中设置)
intent = new Intent(“com.example.administrator.readfile.Open”);
g. 调用receiver.onReceive(mContext, intent);
一句话总结:从AMS.mReceiverResolver中取出符合条件的BroadcastFilter,由BroadcastFilter和intent构造BroadcastRecord并放入BroadcastQueue中,然后从BroadcastQueue中取出BroadcastRecord并解析出receiver和intent,回调onReceive方法
Android系统四大组件源代码情景分析分为以下四个部分讲解
Android系统四大组件源代码情景分析之Activity
Android系统四大组件源代码情景分析之Service
Android系统四大组件源代码情景分析之ContentProvider
Android系统四大组件源代码情景分析之BroadCastRecerver