android开发Activity启动流程简单记录方便搜索以及回顾
1.点击launcher图标
LauncherApp.onClick-> onClickAppShortcut()->startAppShortcutOrInfoActivity()->launcher.startActivitySafely()
Activity.startActivity->startActivityForResult
2.页面启动逻辑
Instrumentation.exeStartActivity -> ams.getService.startActivity(ActivityTaskManager.getService().startActivity) -> startActivityAsUser()
ActivityStarter.startActivity -> ActivityStarter.startActivityUnchecked() -> mRootActivityContainer.resumeFocusedStacksTopActivities();
ActivityStack.resumeTopActivityUncheckedLocked() -> ActivityStack.resumeTopActivityInnerLocked()
mStackSupervisor.startSpecificActivityLocked() -> 判断进程是否已经存在,即ApplicationThread是否为空
//逻辑判断if(ApplicationThread!=null) mStackSupervisor.realStartActivityLocked() else mService.startProcessAsync()开启新进程
//如果ApplicationThread不为空,走步骤4;为空都步骤3
3.第一次启动,ApplicationThread为空进程不存在,调用Process.start开启新进程->入口是android.app.ActivityThread
ActivityManagerService.startProcess() -> mProcessList.startProcessLocked()->Process.start()开启新进程,入口是android.app.ActivityThread
ActivityThread进程启动main函数执行,逻辑进入该main函数
ActivityThread.attach()-> IActivityManager.attachApplication(mAppThread, startSeq)即AMS.attachApplication(mAppThread, startSeq);
//mAppThread即ApplicationThread是ActivityThread的一个内部类,IActivityManager实现类是ActivityManagerService
//也就是将ApplicationThread实例attach给ActivityManagerService(AMS),由AMS管理Application生命周期函数调用
ActivityManagerService.attachApplicationLocked()->ActivityThread.bindApplication()->ActivityThread.handleBindApplication
data.info.makeApplication()即LoadApk.makeApplicationc创建Application实例app->mInstrumentation.callApplicationOnCreate(app)->app.onCreate()
自此,进程被创建,application的onCreate方法被回调。
4.如果进程已经存在了
mStackSupervisor.realStartActivityLocked()->clientTransaction.addCallback(LaunchActivityItem.obtain())、scheduleTransaction(clientTransaction)
ActivityThread.scheduleTransaction()-> LaunchActivityItem.execute()-> client.handleLaunchActivity()、client实例就是ActivityThread
ActivityThread.handleLaunchActivity()->ActivityThread.performLaunchActivity()
mInstrumentation.newActivity()->mInstrumentation.callActivityOnCreate()->Activity.performCreate()-Activity.onCreate()
//This manages the execution of the main thread in an application process 管理主线程的执行操作
//scheduling and executing activities, broadcasts, and other operations on it as the activity manager requests//调度执行AM请求的操作
//ApplicationThread时ActivityThread的内部类,ApplicationThread被attach给IActivityMgr持有(IActivityMgr的实现类是AMS)
//MakeApplication,入口是android.app.Application
简化:
按照以下顺序执行:
app:
Launcher.onCLick(),
Activity.startActivityForResult()
mIntrustment.exctStartActivity()
remote:
ActivityTaskManager.getService().startActivity()
ActivityStarter.startActivityUncheck()
ActivityStack.startActivityLock(),RootActivityContainer.resumeFocusedStacksTopActivities()
ActivityStack.resumeTopActivityUncheckedLocked()
if(exist){
Remote:ActivityStackSupervisor.realStartActivityLocked()
ClientTransaction().addLauncherItem().schedule()
App:ActivityThread.handleLaunchActivity()->mIntrustment.newActivity(),attach(app), call mIntrustment.onActivityCreate()
}else{
Remote:ActivityTaskManagerService.startProcessAsync();
ActivityThread.main()->mgr.attachApplication(this)->mgr call thread.bindApplication()->handleBindApplication()
ClientTransaction().addLauncherItem().schedule()
APP:ActivityThread.handleLaunchActivity()->get app and Activity.attach() it, call mIntrustment.onActivityCreate()
}
【推荐】国内首个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 打造主流大模型对话的一站式集成库