Android開發原始碼解讀四大元件原始碼解讀簡單梳理
阿新 • • 發佈:2021-07-19
Android開發四大元件原始碼解讀簡單梳理
-
Activity啟動流程
//主程序-main Activity.startActivity() mInstrumentation.execStartActivity() ActivityTaskManager.getService().startActivity() - final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE); - return IActivityTaskManager.Stub.asInterface(b); //準備Stack有關的,新的binder程序-AMS ActivityTaskManagerService.startActivity() getActivityStartController().obtainStarter()...execute();//...組裝Request(),接著執行 ActivityStarter.executeRequest(Request request);//啟動器執行Request,新增Activity到ActivityStack - ActivityRecord r = new ActivityRecord() - startActivityUnchecked() - startActivityInner() - addOrReparentStartingActivity();//parent.addChild(mStartActivity)新增Activity到ActivityStack - mTargetStack.getStack().moveToFront("reuseOrNewTask", targetTask); ActivityStack.startActivityLocked() //執行stack邏輯,比如判斷是否顯示前一個Activity視窗過程等等 ActivityRecord.showStartingWindow() //執行當前Activity的show window邏輯 //可能需要新程序,比如第一次啟動程序還不存在 ActivityStarter.startActivityInner() RootWindowContainer.resumeFocusedStacksTopActivities() //如果新程序,則增加下面三個邏輯非同步建立程序 - ActivityStack.resumeTopActivityUncheckedLocked() - ActivityStack.resumeTopActivityInnerLocked - mAtmService.startProcessAsync(); //mAtmService是ActivityTaskManagerService - ActivityManagerInternal::startProcess //建立程序 - ActivityManagerService::LocalService::startProcess() //最好還是回到AMS內部類 - ProcessList.startProcessLocked() - ProcessList.startProcess() - Process.start(entryPoint,...) //entryPoint就是“android.app.ActivityThread ” mSupervisor.mRecentTasks.add(mStartActivity.getTask());//最後新增到最近任務列表 //準備視窗有關的,這裡東西比較多,也比較底層,涉及到Display、Surface、WmService等等 ActivityTaskManagerService.continueWindowLayout() DisplayContent、DisplayManagerService mWmService.mDisplayManagerInternal.performTraversal(mDisplayTransaction); //Activity生命週期有關的,底層Binder-AMS傳送各種和生命週期有關的Transaction與主執行緒ActivityThread互動 ClientTransactionHandler.scheduleTransaction() ActivityThread(extends ClientTransactionHandler).sendMessage() - ActivityThread.mH.sendMessage(msg); - mTransactionExecutor.execute(transaction);//LaunchActivityItem LaunchActivityItem.execute() - client.handleLaunchActivity(r, pendingActions, null); - ActivityThread.performLaunchActivity()
-
Service啟動流程
//main Context.startService() ContextImpl.startServiceCommon() //AMS ActivityManager.getService().startService() ActivityManagerService.startService() ActiveServices.startServiceLocked() //ActiveServices管理Service啟動關閉,前後臺,啟動是否超時等等 - startServiceInnerLocked - bringUpServiceLocked - realStartServiceLocked - app.thread.scheduleCreateService()//ApplicationThread //main ApplicationThread.scheduleCreateService() - sendMessage(H.CREATE_SERVICE, s); - ActivityThread.handleCreateService()
-
Broadcast接收與傳送廣播流程
//main Context.registerReceiver() ContextImpl.registerReceiverInternal() LoadedApk.getReceiverDispatcher() //獲取Dispatcher,儲存Receiver - ReceiverDispatcher.performReceive() //AMS ActivityManager.getService().registerReceiverWithFeature() - rl = new ReceiverList(this, callerApp, callingPid, callingUid, userId, receiver); - mRegisteredReceivers.put(receiver.asBinder(), rl); //AMS的mRegisteredReceivers儲存封裝的接收者列表 - BroadcastFilter bf = new BroadcastFilter(filter, rl, callerPackage, ...); - rl.add(bf); //main Context.sendBroadcast ContextImpl.sendBroadcast //AMS ActivityManager.getService().broadcastIntentWithFeature() ActivityManagerService.broadcastIntentWithFeature() ActivityManagerService.broadcastIntentLocked() - BroadcastRecord r = new BroadcastRecord() - queue.enqueueOrderedBroadcastLocked(r); - ActivityManagerService持有三類廣播,前臺廣播,後臺廣播,離線廣播 BroadcastQueue mFgBroadcastQueue; //是否為前臺廣播通過Intent的flag指定 BroadcastQueue mBgBroadcastQueue; //預設是後臺廣播 BroadcastQueue mOffloadBroadcastQueue; //比如BOOT_COMPLETED廣播 mStickyBroadcasts //粘性廣播使用SparseArray儲存 BroadcastQueue.scheduleBroadcastsLocked() //Handler轉發一次 BroadcastQueue.processNextBroadcast() BroadcastQueue.deliverToRegisteredReceiverLocked() BroadcastQueue.performReceiveLocked() - app.thread.scheduleRegisteredReceiver() LoadedApk.performReceive() - Handler.post(args.getRunnable()) - receiver.onReceive(mContext, intent);
-
ContentProvider初始化流程
//main ActivityThread.main(String[] args) ActivityThread.attach(false, startSeq) - mgr = ActivityManager.getService(); mgr.attachApplication(mAppThread, startSeq); //AMS ActivityManagerService.attachApplication(IApplicationThread thread, long startSeq) ActivityManagerService.attachApplicationLocked(IApplicationThread thread,...) - generateApplicationProvidersLocked()//通過PMS獲取xml註冊的ContentProvider元件 - thread.bindApplication(processName, appInfo, providerList)//將解析的provider資訊傳遞給主程序 //main ActivityThread.bindApplication() - sendMessage(H.BIND_APPLICATION, data); ActivityThread.handleBindApplication(data); ActivityThread.installContentProviders(app, data.providers) - for (ProviderInfo cpi : providers) - installProvider(context, null, cpi,false, true, true); ContentProvider.attachInfo() - ContentProvider.this.onCreate(); //ContentProvider的初始化是在Application之前哦。。。 //main ContentResolver.insert() ContentProvider.acquireProvider() ActivityThread.acquireExistingProvider()//獲取ContentProviderProxy代理類 ContentProviderProxy.insert() //binder通訊mRemote.transact -> onTransact ContentProviderNative.insert()