随手可得的Application对象
在Android的开发其中,Application和Context对象应该是我们接触最多的对象了,特别是Context对象。
当我们在某个Activity或者Service其中时,因为它们本身就是Context的子类。因此“this”能够等价于Context对象使用。
然而。在非常多时候这个Context并非那么随手可得。试想一下下面情况:
- 须要用到Context的SDK,开发人员为了使用SDK须要加入Context的传递代码;
- 二次打包的加插代码假设须要使用Context。则须要改动原来的逻辑。把Context传递进来。
- 注入到Java环境之后,须要用到Context。訪问各种IPC的服务;
- 等等
因此假设能够找到一种方式,能够在不接触原来逻辑的前提下,获取到当前进程的Application对象,那上述提及的问题就能够迎刃而解了。
这里说得有点抽象,比方当我们编写自己定义的Application类时,通常会这加入一个静态方法getContext(或者其它相似名字)。例如以下所看到的:
class final MyApplication extends Application{
private static Application sInstance;
@Override
public void onCreate(){
sInstance = this;
}
public static Application getContext(){
return sInstance;
}
//...
//...
}
这个代码大家一看就懂,主要就是方便后面要使用Context时使用的,因为Application是全局的,因此能够防止内在泄漏。但怎样能够做过不通过这样的方式。甚至在没有自己定义Application的情况下。也能够拿到这个Application对象呢?
事实上这次的干货不多,这里我提供一个方法,这种方法能够兼容1.6至5.1(之后的固件应该也能兼容)。
主要是通过反射的方式,获取系统类的静态字段,步骤例如以下:
- 通过RuntimeInit类,获取到mApplicationObject静态字段,这个字段的类型为android.app.ActivityThread$ApplicationThread。
- 通过ApplicationThread类。获取this$0字段,注意这个是编译器生成的,这个字段的类型是android.app.ActivityThread;
- 通过ActivityThread类。获取其mInitialApplication字段,这个字段即是Application对象;
因为涉及到反射调用,完整代码就不写好。写个简单的伪代码吧
Applicatioin app = RuntimeInit.mApplicationObject.this$0.mInitialApplication;
能够肯定。这不是唯一的方法,大家有什么好的方式,欢迎分享。
随手可得的Application对象的更多相关文章
- Application对象、ViewState对象、分页展示--2017年1月4日
Application对象 存储 Application 变量 Application["application名称"] = "application的值"; ...
- JSP内置对象之application对象
虽然常把Web应用称为B/S架构的应用,但其实Web应用一样是C/S结构的应用,只是这种应用的服务器是Web服务器,而客户端是浏览器. 现在抛开Web应用直接看Web服务器和浏览器. Web服务器负责 ...
- 什么是Cookie对象,Session对象,Application对象。
Cookie是: 一个由网页服务器放在您硬盘上的非常小的文本文件. 它本质上就像您的身份证明一样,并且不能像代码那样被执行或被用来散布病毒.它只能被您使用并且只能由提供的服务器读取. 使用Cookie ...
- Application对象、Session对象、Cookie对象、Server对象初步认识
Application对象:记录应用程序参数的对象 用于共享应用程序级信息,即多个用户共享一个Application对象.在第一个用户请求ASP.NET文件时,将启动应用程序并创建Applicatio ...
- Android Application 对象介绍
What is Application Application和Actovotu,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application ...
- ASP.NET中application对象的用法
一.Application对象的理解 Application对象在实际网络开发中的用途就是记录整个网络的信息,如上线人数.在线名单.意见调查和网上选举等.在给定的应用程序的多有用户之间共享信息,并在服 ...
- [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- ASP.NET中application对象
ASP.NET中application对象的使用. Application对象的应用 1.使用Application对象保存信息 (1).使用Application对象保存信息 Applicat ...
- 初识 Asp.Net内置对象之Application对象
Application对象 Applocation对象用于共享应用程序级信息,即多个用户可以共享一个Applocation对象. 用户在请求Asp.Net文件时,将启动应用程序并且创建Applicat ...
随机推荐
- 如何在手机上查看测试vue-cli构建的项目
用vue-cli构建的项目有时候有些功能需要在手机上测试,比如上传图片的时候调用手机拍照功能或者查看相册的功能,这个时候就要用到手机测试了,那么如何在手机上查看测试vue-cli构建的项目?今天就写一 ...
- 洛谷 P1881 绳子对折
P1881 绳子对折 题目描述 FJ 有一个长度为L(1<= L <= 10,000)的绳子. 这个绳子上有N(1 <= N <= 100)个结,包括两个端点. FJ想将绳子对 ...
- Java&Xml教程(九)Java中通过XSD校验XML合法性
Java XML校验API可以通过XSD(XML Schema Definition)校验XML文件内容的合法性. 在以下的案例中使用javax.xml.validation.Validator 类通 ...
- 中小型WEB系统权限日志数据表设计
中小型WEB系统权限日志数据表设计 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjc1MDU3OA==/font/5a6L5L2T/fontsi ...
- Java Reflection - Getters and Setters
原文链接:http://tutorials.jenkov.com/java-reflection/getters-setters.html 通过使用 Java 反射,我们能够在程序执行时观察 clas ...
- 亚马逊AWS的route53的收费,月费最低 0.9 USD
亚马逊AWS的route53的收费Amazon Route 53 定价 https://aws.amazon.com/cn/route53/pricing/ 一文中,对于一些术语的解释第一项收费--域 ...
- Menu-actionBarMenu字体颜色修改
经常会遇到对menu字体颜色进行修改的情况,今天就遇到了一个.就是在action上有一个menu是黑色的,想要改成白色.方法如下 <style name="Email.Theme&qu ...
- Linux下SPI读写外部寄存器的操作
SPI写寄存器操作: staticvoid mcp251x_write_reg(struct spi_device *spi, uint8_t reg, uint8_t val) { stru ...
- 76.CGI编码
CGI编码 "%D6%DC%C8%F0%B8%A3"; 转换到字符串中: //CGI编码转到char类型的tmpstr中中 char* change(char *str) { // ...
- [ Tomcat ] [ startup ] Tomcat 無法在時限內開啟問題
http://www.ewdna.com/2011/12/tomcat-server-in-eclipse-unable-to.html