美文网首页
源码Activiy,Service,BroadCat,Conte

源码Activiy,Service,BroadCat,Conte

作者: 百花鱼藤 | 来源:发表于2018-07-01 17:38 被阅读0次

1、Launcher启动Activity
 Launcher->startAcvtivitySaftly();
Activity->startActivity()->startActivityForResult()
Instrumentation ->execStartActivity()
ActivityManagerNative.getDefault()->.startActivity()
ActivityManagerProxy.startActivity()
ActivityManagerService.startActivity()
ActivityStack->startActivityMayWait():获取ActivityInfo intent.setCompont()
startActivityLocked()获取进程信息ProcessRecord()-记录Activity信息ActivityRecord()
startActivityUncheckedLocked():对Task进行一些判断->startActivityLocked()->
resumeTopActivityLocked()->startPausingLocked:把当前Activity设置为pasue状态
ApplicationThreadProxy.schedulePauseActivity():函数通过Binder进程间通信机制进入到ApplicationThread.schedulePauseActivity函数中 ,调用的函数queueOrSendMessage是ActivityThread类的成员函数ApplicationThread是ActivityThread的内部类
ActivityThread.queueOrSendMessage :mhanlder.sendMessage()->handlerMessage->
handlePauseActivity()->ActivityManagerNative.getDefault().activityPaused()
ActivityManagerProxy.activityPaused()->ActivityManagerService.activityPaused->
ActivityStack .activityPaused(token, icicle, false)-> ActivityStack.completePauseLocked

 ActivityStack.completePauseLocked-resumeTopActivityLocked(prev)->. ActivityStack.startSpecificActivityLocked->startSpecificActivityLocked():第一次启动创建进程ProcessRecord:ActivityManagerService.startProcessLocked()-startProcessLocked()
Process.start("android.app.ActivityThread"):创建新进程,执行ActivityThread的main函数->
attach()函数ActivityManagerNative.getDefault().attachApplication(mAppThread)
->ActivityManagerProxy.attachApplication->ActivityManagerService.attachApplication->ActivityManagerService.attachApplicationLocked

ActivityManagerService.attachApplicationLocked ApplicationThread.scheduleLaunchActivity()
ApplicationThreadProxy.scheduleLaunchActivity
 ApplicationThread.scheduleLaunchActivity queueOrSendMessage(H.LAUNCH_ACTIVITY, r);
ActivityThread.queueOrSendMessag-handleMessage-handleLaunchActivity(r, null);
ActivityThread.handleLaunchActivity-handleResumeActivity(r.token, false, r.isForward);
handleResumeActivity(r.token, false, r.isForward);
ActivityThread.performLaunchActivity:主要package和component信息,加ClassLoader将MainActivity类加载进来,创建APPlication activity.attach->callActivityOnCreate

二、Service

ContextImpl.startService
ActivitManagerServiceProxy.startservice
ActivitMangerServcie.startservice:
ActivitMangerServcie.startservicelocked:retrieveServiceLocked:解析Intent
ActivitMangerServcie.bringUpServiceLocked:函数来创建一个新的进程
ActivitMangerServcie.startProcessLocked:rocess.start("android.app.ActivityThread")
ActivityThread.main:创建ActivityRecord,然后调用attach方法
ActivityThread.attach:ActivityManagerNative.getDefault().attachApplication
ActivityManagerProxy.attachApplication
 ActivityManagerService.attachApplication
ActivityManagerService.attachApplicationLocked
ActivityManagerService.realStartServiceLocked
ApplicationThreadProxy.scheduleCreateService 
 ApplicationThread.scheduleCreateService
.ActivityThread.queueOrSendMessage
ActivityThread.handlerMessage:handleCreateService
ActivityThread.handleCreateService:获取Application
 ClassLoader.loadClass
Service.onCreate

三、bindService

 LoadApk.getServiceDispatcher ActivityManagerNative.getDefault().bindService
LoadedApk.getServiceDispatcher:判断LoadApk.serviceDispather是否存在,存在直接返回,不存在创建,并放入hashMap,key为ServiceConnection,然后调用serviceDispather.getIServiceConnection():创建InnerConnection,是一个Binder对象 ActivityManagerProxy .bindService
ActivityManagerService.bindService:获取ProcessRecord,ActivityRecord,retrieveServiceLocked 获得到一个ServiceRecord,创建ConnectionRecord ,就是CounterService,创建ConnectionRecord,bringUpServiceLocked:获取ProcessRecord,realStartServiceLocked
ActivityManagerService.startProcessLocked(appName, r.appInfo,true, intentFlags,"service", r.name,false) ==null)
ActivityManagerService.realStartServiceLocked app.servicres.add(r):添加ServiceRecord,
ApplicationThread.scheduleCreateService:启动ServiceRecord,CountService.oncrate被调用
requestServiceBindingsLocked();获取Binder对象,onbind被调用ActivityManagerService.realStartServiceLocked
ApplicationThreadProxy.scheduleCreateService 
 ApplicationThread.scheduleCreateService
.ActivityThread.queueOrSendMessage
ActivityThread.handlerMessage:handleCreateService
ActivityThread.handleCreateService:获取Application
 ClassLoader.loadClass
Service.onCreate

requestServiceBindingsLocked()
ActivityManagerService.requestServiceBindingsLocked-requestServiceBindingsLocked
 ApplicationThreadProxy.scheduleBindService 
 ApplicationThread.scheduleBindService
.ActivityThread.queueOrSendMessage
ActivityThread.handleBindService:IBinder binder = s.onBind(data.intent);ActivityManagerNative.getDefault().publishService
OnBind:获取CounterBinder对象
ActivityManagerService.publishService
ActivityManagerService.publishService:InnerConnection.connected
ServiceDispatcher.connected:Handler.post(new RunConnection):把一个消息放到ActivityThread的消息队列中
RunConnection.run:ServiceDispatcher.doConnected
ServiceConnection.onServiceConnected:CounterBinder.getService:CounterService.this
ServiceRecord-connectionRecord-InnerConnection-connected

四、BroadCast

注册广播 
ContextWrapper.registerReceiver
ContextImpl.registerReceiver registerReceiverInternal
mPackageInfo.getReceiverDispatcher :返回IIntentReceiver,是一个Bind对象
ActivityManagerNative.getDefault().registerReceiver
LoadedApk.getReceiverDispatcher:判断ReceiveDispatcher是否存在,不存在就创建,放到hashMap中
 ActivityManagerProxy.registerReceiver
ActivityManagerService.registerReceiver:获取ProcessRecord函数的应用程序进程记录块
把ReceiveList放进ActivityManagerService mRegisteredReceivers中,创建BroadCastFilter
把广播接收器列表rl和filter关联起来,然后保存在ActivityManagerService中的成员变量mReceiverResolver中去。

发送广播
ContextWrapper.sendBroadcast
ContextImpl.sendBroadcast
ActivityManagerNative.getDefault().broadcastIntent
ActivityManagerProxy.broadcastIntent
ActivityManagerService.broadcastIntent:获取进程的一些信息
 ActivityManagerService.broadcastIntentLocked:创建BroadcastRecord 记录了这个广播是由谁发出的以及要发给谁等相关信息。
scheduleBroadcastsLocked
ActivityManagerService.scheduleBroadcastsLocked:Hanlder.ActivityManagerService的内部类
handler.hanleMessage:processNextBroadcast
ActivityManagerService.processNextBroadcast:获BroadcastRecord,获取里面广播接收列表,进行for循环发个每个广播接收者deliverToRegisteredReceiverLocked
ActivityManagerService.deliverToRegisteredReceiverLocked
ActivityManagerService.performReceiveLocked:app.thread.scheduleRegisteredReceiver
ApplicationThreadProxy.scheduleRegisteredReceiver
ApplicaitonThread.scheduleRegisteredReceiver
 InnerReceiver.performReceive
 ReceiverDispatcher.performReceive
mActivityThread.post(Args.run):把一个消息放到ActivityThread的消息队列中
Run;调用BroadCastReceiver.onreceive方法。 

五、ContentResolver

ContentResolver.acquireProvider:获取acquireProvider,在ContextImp中ApplicationContentResolve.acquireProvider
ActivityThread.acquireProvider
ActivityThread.getProvider:判断IContentProvider 是否存在,存在就直接返回,不存在就创建一个。
ActivityManagerNative.getDefault().getContentProvider:返回IActivityManager.ContentProviderHolder
installProvider:返回IContentProvider
 ActivityManagerService.getContentProvider
ActivityManagerService.getContentProviderImpl:判断ProcessRecord ,通过它的resolveContentProvider和getApplicationInfo获取Prover信息,创建ConentProviderRecord,不存在就创建,然后判断provider是否启动,如果没启动
startProcessLocked(cpi.processName,cpr.appInfo,false,0,"content provider):返回ProcessRecord ,同步等待ContentProviderRecord的provider
ActivityManagerService.startProcessLocked
 Process.start
 ActivityThread.main
ActivityThread.attach
 ActivityManagerService.attachApplication
ActivityManagerService.attachApplicationLocked:获取进程记录块,generateApplicationProvidersLocked返回ContentProvider列表,
ApplicationThread.bindApplication:queueOrSendMessage
ActivityThread.handleBindApplication
ActivityThread.installContentProviders:循环ProviderInfo列表,installProvider:本地安装每一个Content Proivder的信息,创建一个ContentProviderHolder对象来保存相关的信息,ContentProviderHolder对象是一个Binder对象,ActivityManagerNative.getDefault().publishContentProviders,publishContentProviders函数的作用就是用来唤醒等待的线程。
 ActivityThread.installProvider:创建ContentProvider,加载好的Content Provider,获取IContentProvider 获得一个Binder对象
ContentProvider.getIContentProvider
 ContentProvider.attachInfo:设置读写权限,调用ContentProvider.oncreate方法。

 ActivityMangerService.publishContentProviders:获取ContentProviderRecord 把这个Content Provider信息保存好在mProvidersByClass和mProvidersByName中:加载完毕,从列表中删除。

六、Content Provider的共享数据更新通知机

包括:Content Provider的共享数据更新通知机,Android系统进程Zygote在启动的时候,在启动一个System进程来加载系统的一些关键服务,而ContentService就这些关键服务之一了。在System进程中,负责加载系统关键服务的类为SystemServer类,它会通过启动一个线程SystemThread来加载这些关键服务:
ContentService的启动过程分析 :调用ContentService.main ServicerManager.addService()

ContentObserver的注册过程分析

getContentResolver().registerContentObserver(ContentObserver )
ContentResolver.registerContentObserver
getContentService().registerContentObserver
ContentResolver.getContentService:
ServiceManager.getService(CONTENT_SERVICE_NAME);获取binder对象IContentService.Stub.asInterface(b):返回IContentService
ContentObserver.getContentObserver: Transport extends IContentObserver.Stub
ContentService.registerContentObserver
ObserverNode.addObserverLocked
数据更新通知的发送过程

ContentResolver.notifyChange
ContentService.notifyChange:调用ObserverNode.collectObserversLocked,ContentObserver.onChaged
ObserverNode.collectObserversLocked:遍历,创建Observercall,放到集合中
Transport.onChange
 ContentObserver.dispatchChange:Handler.post(new NotificationRunnable(selfChange))
NotificationRunnable.run
ContentObserver.this.onChange(mSelf)

相关文章

网友评论

      本文标题:源码Activiy,Service,BroadCat,Conte

      本文链接:https://www.haomeiwen.com/subject/urjtuftx.html