随手可得的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 ...
随机推荐
- Python的正则表达概述
本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...
- poj3244(公式题)
Difference between Triplets Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 2476 Acce ...
- unity3d编程日志
2014/4/27 编写脚本的时候,加入了中文凝视,发现console面板有非常多不可思议的bug.查了一下发现是由于monodevelop脚本中文凝视报错,而英文凝视不会受影响. 解决方法:把凝视放 ...
- java移位操作符注意的问题
如果对char,byte或者short类型的数值进行移位处理,那么在移位进行之前,他们会被转为int类型, 并且所得到的结果也是一个int型. 若对long类型的数值进行处理所得到的结果也是long. ...
- Eclipse&STS常用小技巧
开发是经常用到的代码可进行快捷提示,比如mian alt+/就提示出了main方法是不是很方便,为什么就能提示出来呢? 马上来了: 在你使用的java开发工具中点击Window--->Prefe ...
- File Upload with Jersey
package com.toic.rest; import java.io.File; import java.io.FileOutputStream; import java.io.IOExcept ...
- Linux的一些简单命令操作
防火墙 查看防火墙状态 systemctl status iptables (或service iptables status) 关闭防火墙 systemctl stop iptables(或serv ...
- 洛谷——P1540 机器翻译
https://www.luogu.org/problem/show?pid=1540#sub 题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的 ...
- 原生js大总结四
031.数组常用的一些方法 1.push: 在数组最后添加一个或者多个元素,返回添加后数组的长度 2.pop: 从数组最后取出一个元素,返回的是数组的最后一个元素(取出的元素) 3.uns ...
- 00099_commons-IO
1.导入classpath (1)加入classpath的第三方jar包内的class文件才能在项目中使用: (2)创建lib文件夹: (3)将commons-io.jar拷贝到lib文件夹: (4) ...