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()
}
 
复制代码

 

posted @   yongfengnice  阅读(388)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示