在Android的开发当中,Application和Context对象应该是我们接触最多的对象了,特别是Context对象。

当我们在某个Activity或者Service当中时,由于它们本身就是Context的子类,因此“this”可以等价于Context对象使用。然而,在很多时候这个Context并不是那么随手可得,试想一下以下情况:

  • 需要用到Context的SDK,开发者为了使用SDK需要添加Context的传递代码;
  • 二次打包的加插代码如果需要使用Context,则需要修改原来的逻辑,把Context传递进来;
  • 注入到Java环境之后,需要用到Context,访问各种IPC的服务;
  • 等等

因此如果可以找到一种方式,可以在不接触原来逻辑的前提下,获取到当前进程的Application对象,那上述提及的问题就可以迎刃而解了。这里说得有点抽象,比如当我们编写自定义的Application类时,一般会这添加一个静态方法getContext(或者其他类似名字),如下所示:

这个代码大家一看就懂,主要就是方便后面要使用Context时使用的,由于Application是全局的,因此可以防止内在泄漏。但如何可以做过不通过这种方式,甚至在没有自定义Application的情况下,也可以拿到这个Application对象呢?

其实这次的干货不多,这里我提供一个方法,这个方法可以兼容1.6至5.1(之后的固件应该也能兼容)。

主要是通过反射的方式,获取系统类的静态字段,过程如下:

  • 通过RuntimeInit类,获取到mApplicationObject静态字段,这个字段的类型为android.app.ActivityThread$ApplicationThread;
  • 通过ApplicationThread类,获取this$0字段,注意这个是编译器生成的,这个字段的类型是android.app.ActivityThread;
  • 通过ActivityThread类,获取其mInitialApplication字段,这个字段即是Application对象;

由于涉及到反射调用,完整代码就不写好,写个简单的伪代码吧


原文地址: http://blog.csdn.net/l173864930/article/details/46919457

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. Winow&WindowManager
  3. 【我的Android进阶之旅】使用Android(安卓)Studio 3.6 的 Androi
  4. C#、Golang、Python、Java(Android)之间Des、Rsa加解密互通系列之G
  5. 两分钟彻底让你明白Android(安卓)Activity生命周期
  6. Android(安卓)序列化
  7. Android的四个基本概念(线程通信和GLSurfaceView)
  8. 你不得不了解的JVM(一)
  9. Android实现语音数据实时采集、播放

随机推荐

  1. 在android上实施不会OOM的内存管理方案
  2. Android通过ksoap2这个框架调用webservic
  3. Android权限申请的学习实践
  4. 移动应用界面设计的尺寸规范
  5. Android图形图像处理:canvas的save()和res
  6. Android(安卓)Gradle配置资源前缀
  7. Android(安卓)如何获取当前Activity实例
  8. Android(安卓)Studio3.5 xml文件格式化(R
  9. Android基础笔记(十一)- Service基础和注意
  10. Android中利用反射机制来控制AlertDialog