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()
    
上一篇:Android开发涉及到的AMS类和ActivityThread类源码解读


下一篇:Redis 实例对比工具之 Redis-full-check