Android源码分析-全面明白Context (二)

源代码 2024-9-15 19:50:13 123 0 来自 中国
接着上篇Android源码分析-全面明白Context (一)继续讲:
Service对象中ContextImpl的创建
通过查察源码发现和Activity,Application是同等的。分析到这里,那么三者的Context有什么区别呢,有一些细节是必要注意的:Dialog的使用是必要Activity
在桌面上我们采用Application的Context无法弹出平常对话框等等。
Context对资源的访问
很明白,差别的Context得到的都是同一份资源,请看下面的分析
我们得到资源的方式为context.getResources,而真正的实现位于ContextImpl中的getResources方法,在ContextImpl中有一个成员变量mResources
1.png 它就是getResources方法返回的结果,mResources的赋值代码为:
2.png 下面来看一下ResourcesManager的getTopLevelResources方法,它的这个方法是如许的:在ResourcesManager中,全部的资源对象都被存储在ArrayMap中,起首根据当前的哀求参数去查找资源,假如找到了就返回,否则就创建一个资源对象放在ArrayMap中,有一点必要说明的是为什么会有多个资源对象,由于在res下面存在多个适配差别装备,差别分辨率,差别系统版本的目次,按照android系统的筹划,差别装备在访问同一个应用的时间访问资源可以差别,好比drawable-hdpi和drawable-xhdpi就是典范的例子。


3.png

4.png 根据上述代码中的哀求机制,再加上ResourcesManager采用单例模式,这就包管了差别的ContextImpl访问的是同一套资源,注意这里说的同一套资源未必是同一个资源,由于资源大概位于差别的目次,在装备参数和表现参数稳定的情况下,差别的ContextImpl访问到的是同一份资源,只管Application,Activity,Service都有本身的ContextImpl,而且每个ContextImpl都有本身的mResources成员,但是由于它们的mResources成员都是来自唯一的ResourcesManager实例,以是它们实际上还是同一个内存所在。
getApplication和getApplicationContext的区别:
getApplication返回结果为Application,且差别的Activity和Service返回的Application均为同一个全局对象,在ActivityThread内部有一个列表专门用于维护全部应用的application
getApplicationContext返回的也是Application对象,只不外返回范例为Context,看看它的实现
上面代码中mPackageInfo是包罗当前应用的包信息,好比包名,应用的安装目次等,原则上来说作为第三方应用,包信息不大概为空,在这种情况下,getApplicationContext返回的对象和getApplication是同一个。但对于系统应用,包信息大概为空。
综上所述:两者的区别仅仅是返回范例差别。
应用中Context数量
一个应用中Context的数量即是Activity的个数+Service的个数+Application个数(通常单进程APP为1)。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-21 20:37, Processed in 0.160869 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表