美文网首页
资源是如何加载的,context.getResource原理

资源是如何加载的,context.getResource原理

作者: 小水neo | 来源:发表于2020-12-09 18:56 被阅读0次

Context之间的关系

Context类之间的继承关系

可以看到,Context的具体实现是在ContextIml和ContextWrapper之中,而经过阅读源码发现,Resource的构造主要是在ContextIml中实现的,接下来的部分分析源码的调用流程。

context.getResource的调用原理:

该部分主要涉及到的是源码的阅读,此处贴一张UML时序图,有兴趣的可以自行阅读:


UML时序图.png

Context的用法:

  1. 获取屏幕方向int类型,1:portrait,2:landscape
context.getResources().getConfiguration().orientation;
  1. 资源文件名为index.html, 不需要带后缀.htm
InputStream fs =this.getResources().openRawResource(R.raw.index.htm); 
    InputStreamReader read = new InputStreamReader (fs,"utf-8");    
    BufferedReader in = new BufferedReader(read);
  1. 读取res/drawable目录下的png或者bmp
  • 得到Resources对象
Resources r = this.getContext().getResources();    
  • 以数据流的方式读取资源
Inputstream is = r.openRawResource(R.drawable.mm_image);    
BitmapDrawable bmpDraw = new BitmapDrawable(is);    
Bitmap bmp = bmpDraw.getBitmap();
  1. 获取屏幕密度
float density = getResources().getDisplayMetrics().density;
  1. 获取dimens资源定义的像素数
 Context.getResources().getDimensionPixelSize();
  1. 获取颜色资源
 Context.getResources().getColor(R.color.colorId);
  1. 获取字符串资源
Context.getResources().getString(R.string.stringId);
  1. 获取字符串数组:
String[] roles = context.getResources().getStringArray(R.array.array_role_values);  

完整的Resource对用流程(从应用启动开始)

  1. 在主页点击App,此时是运行在Launcher进程,通过ActivityManagerServiceBinder IPC的形式向system_server进程发起startActivity的请求
  2. system_server进程接收到请求后,通过Process.start方法向zygote进程发送创建进程的请求
    zygote进程fork出新的子进程,即App进程
  3. 进入ActivityThread.main方法中,这时运行在App进程中,通过ActivityManagerServiceBinder IPC的形式向system_server进程发起attachApplication请求
  4. server给Binder线程发送Secheduled launcher,binder给Activity.thread发送LaunchActivity
  5. Activity.thread执行
  • 创建contex:ContextImpl context = ContextImpl.createAppContext(this, packageInfo);
  • ContextImpl初始化时获取Resources对象: Resources resources = packageInfo.getResources(mainThread); (LoadedApk类型)
  • createResourcesImpl中调用了createAssetManager,绑定了addAssetPath
    接下来就和上文所述的Resource获取相同,不再多做赘述。

Q&A

一个应用中Context的数量?
Activity数量+Service数量+Application数量(通常为1,一个进程中只有一个Application)

扩展和引申

  1. java类加载机制
    2.H5的加载流程, React Native、Weex呢

相关文章

  • 资源是如何加载的,context.getResource原理

    Context之间的关系 可以看到,Context的具体实现是在ContextIml和ContextWrapper...

  • 第一代插件化:代理实现(dynamic-load-apk)

    原理与背景 如何启动未安装的apk(四大组件)里的类。如何加载类、加载资源、管理组件生命周期。 类加载 外部的de...

  • Android面试题整理

    Android方面: 1、View事件分发机制 2、资源加载原理 3、内存优化(内存泄漏、内存溢出),如何查找内存...

  • 本地资源加载方案

    replugin资源加载方案 基本原理: 通过调用PackageManager中getPackageArchive...

  • CocosCreator 引擎资源加载与释放原理简析

    本文主要内容如下: 资源加载与释放部分代码所在 调试、修改引擎源码的方法 资源加载与释放原理简析 如要了解 Coc...

  • Vue自定义指令实现图片懒加载

    什么是图片懒加载 进入页面的时候,只请求可视区域的图片资源 懒加载原理 图片的标签是 img 标签,图片的来源主要...

  • 资源加载的流程

    APP加载资源 我们APP中经常会用到图片,颜色等资源,但是你是否清楚这些资源是从什么时机,如何加载到我们的页面吗...

  • Glide最新源码解析(三)- 加载Model

    介绍 上一篇介绍了加载资源的流程,主要讲解了加载资源的主流程,本篇主要讲解从Model到Data是如何加载的? M...

  • 三、页面性能优化

    《指尖上行——移动前端开发进阶之路》学习笔记 第三章:介绍页面性能的优化原理,如如何进行资源优化、加载优化及脚本优...

  • webpack

    loader 是webpack的核心工作原理,通过这些资源加载器,完成webpack的打包工作plugin相当于挂...

网友评论

      本文标题:资源是如何加载的,context.getResource原理

      本文链接:https://www.haomeiwen.com/subject/coitgktx.html