ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Android开发源码解读四大组件源码解读简单梳理

2021-07-19 12:33:09  阅读:260  来源: 互联网

标签:BroadcastQueue ActivityManagerService ActivityThread 解读 源码 Activity Android main


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()
    

标签:BroadcastQueue,ActivityManagerService,ActivityThread,解读,源码,Activity,Android,main
来源: https://www.cnblogs.com/yongfengnice/p/15029638.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有