1. 程式人生 > 其它 >Android開發原始碼解讀四大元件原始碼解讀簡單梳理

Android開發原始碼解讀四大元件原始碼解讀簡單梳理

Android開發四大元件原始碼解讀簡單梳理

  1. 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()
    
  2. 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()
    
  3. 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);
    
    
  4. 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()