Android系统四大组件源代码情景分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/litao55555/article/details/83962063

在开发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

猜你喜欢

转载自blog.csdn.net/litao55555/article/details/83962063
今日推荐