Application,Activity,Service的创建流程(1)

Context简介

Context的中文意思是上下文,可以简单的理解为运行环境,提供一些非常Base的接口,例如获取资源管理器,App缓存目录等

从Context源码中得出Context是个抽象类,其功能的实现应该交给了其子类,那么我们就看看Context的继承关系
此图源自自郭霖大神的Blog 从源码可以看出,Context有两个直接的子类ContextWrapper和ContextImpl,并且Application,Service,Activity都继承ContextWrapper,下面我们看看ContextWrapper的源码:
从源码可以看出,ContextWrapper把功能都委托给mBase来做(代理模式) 让我们再来Context的另外一个实现类ContextImpl的源码:
从源码可以看出,ContextImpl实现了Context的所有功能。综上我们可以推断ContextWrapper中的mBase应该是ContextImpl对象,下面通过Application,Activity,Service的创建流程来证实这个推断。

Application的创建流程

这张图主要展示了启动Activity,Service的简要过程,在启动Activity,Service的同时也会创建Application a. ActivityThread就是我们常说的UI线程,它负责Activity,Service,Application的调度等工作,感兴趣的朋友可以阅读下他的源码. b. ApplicationThread是ActivityThread的一个内部类,本质上是一个IBinder对象,他的主要作用是用于AMS(ActivityManagerService的简称)与ActivityThread通信,例如AMS在处理完Server端ActivityRecord的创建,栈管理后通过ApplicationThread来通知ActivityThread可以创建对应的Activity和执行Activity的生命周期了。

下面我们从AMS回调启动Activity的流程来看下Application的创建流程
  1. AMS会通过调用ApplicationThread的scheduleLaunchActivity(...)来告诉ActivityThread它可以创建Activity了
  2. 然后发送LAUNCH_ACTIVITY消息出去
  3. 接着调用 handleLaunchActivity(...)
  4. 然后调用performLauncherActivity(...)
    我们关注下createBaseContextForActivity(...),他创建了CotnextImpl对象,接着调用Activity的attach(...),把ContextImpl对象传了进去,从而证明了Activity内部对应的mBase就是ContextImpl。
  5. 然后调用了LoadedApk的makeApplication(...)
    如果mApplication不为null则直接返回它,mApplication是LoadedApk中的一个全局对象,一个APP进程只会创建一次。然后创建ContextImpl对象,并且在调用Intrumentation的newApplication(...)的时候传了进去,接着调用了Intrmentation的callApplicationOnCreate(...) 接下来我们看看Intrumentation的newApplication(...)和callApplicationOnCreate(...)做了什么
    从代码中我们可以看出,Application创建后,调用了attach(...),把ContextImpl对象传了进去,也就证明了Application内部对应的mBase就是ContextImpl,同时在attach方法中调用了执行了Application的生命周期方法attachBaseContext(...)
    从代码中可以看出,callApplicationOnCreate执行了Application生命周期方法onCreate(...)
上面的代码都是在UI线程执行的,因此不要在Application的生命周期方法attachBaseContext(...)和onCreate(...)做耗时操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android系统的启动流程可以简单分为以下几个步骤:\[1\] 1. 前期准备工作:包括系统服务的初始化、创建ActivityThread线程等。 2. 启动AMS:创建ActivityManagerService对象,并注册系统服务。 3. 启动Zygote进程:Zygote是Android系统的孵化器进程,负责创建新的应用进程。 4. 创建应用进程:Zygote根据应用的包名创建新的应用进程,并加载应用的代码和资源。 5. 启动应用:应用进程启动后,会创建Application对象,并执行Application的生命周期方法。 6. 创建Activity:应用启动后,根据启动模式和Intent创建相应的Activity,并进行Activity的生命周期管理。 7. 显示界面:Activity创建完成后,会通过WindowManagerService进行窗口管理,将界面显示到屏幕上。 在AMS加载Application流程中,主要包括以下几个步骤:\[3\] 1. 前期准备工作:包括创建ActivityManagerService对象、注册系统服务等。 2. 创建Application对象:根据应用的包名和类名,通过反射创建Application对象。 3. 调用Application的生命周期方法:调用Application的attachBaseContext()、onCreate()等生命周期方法,完成应用的初始化工作。 在启动过程中,需要处理的问题包括:\[1\] 1. 冷启动时间过长:可以通过优化应用的启动流程、减少启动时的耗时操作等方式来缩短冷启动时间。 2. 黑白屏问题:可以通过在启动过程中显示一个启动界面,或者使用启动图等方式来解决黑白屏问题。 3. 启动优化:可以通过优化应用的启动流程、减少启动时的资源加载等方式来提升应用的启动速度和执行效率。 WMS(Window Manager Service)对启动优化的意义在于,它负责管理应用的窗口显示,包括界面的布局、绘制等。通过优化WMS的处理流程,可以提升应用的界面显示效果和响应速度,从而提升用户体验。\[2\] #### 引用[.reference_title] - *1* *2* [Android面试题——高级开发面试题一](https://blog.csdn.net/Calvin_zhou/article/details/128123302)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Android系统服务 AMS 启动流程](https://blog.csdn.net/bugyinyin/article/details/126520417)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值