Android开发源码解读四大组件源码解读简单梳理
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()
分类:
android系统源码分析
标签:
Android源码解读
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2018-07-19 Android混淆Can't find common super class of的解决方法