随手可得的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 ...
随机推荐
- AtomicInteger类
今天写代码.尝试使用了AtomicInteger这个类,感觉使用起来非常爽,特别适用于高并发訪问.能保证i++,++id等系列操作的原子性. ++i和i++操作并非线程安全的.非常多人会用到synch ...
- git -处理分支合并
1.分支间的合并 1)直接合并:把两个分支上的历史轨迹合二为一(就是所以修改都全部合并) zhangshuli@zhangshuli-MS-:~/myGit$ vim merge.txt zhangs ...
- actionMode - 在屏幕中的显示位置设置
actionMode 默认的显示位置是在屏幕上方的,如果想要移到下方,可以添加如下属性 在AndroidManifest.xml 的activity中,做如下修改 <activity andro ...
- android图片特效处理之光照效果
这篇将讲到图片特效处理的光照效果.跟前面一样是对像素点进行处理,算法是通用的. 算法原理:图片上面的像素点按照给定圆心,按照圆半径的变化,像素点的RGB值分别加上相应的值作为当前点的RGB值. 例: ...
- Android学习笔记进阶十三获得本地全部照片
这是Intent的一个用法. 在ActivityAction里面有一个“ACTION_GET_CONTENT”字符串常量,该常量让用户选择特定类型的数据. intent.setType("i ...
- Flume的client
Client:生产数据,运行在一个独立的线程.
- Java学习笔记五 常用API对象一
常用API:字符串操作:String类,StringBuffer类,StringBulider类 字符串是最重要的数据类型之一,处理字符串也是一种语言的基本工作. 1.String类: public ...
- 自绘listCtrl控件选中该行高亮(模拟windows)
CListCtrl的派生类CMyListCtrl的DrawItem()函数里添加代码 CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC); if ...
- [MySQL 5.1 体验]MySQL 实例管理器 mysqlmanager 初试
原贴:http://imysql.cn/node/313 [MySQL 5.1 体验]MySQL 实例管理器 mysqlmanager 初试 周二, 2007/06/19 - 22:10 - yejr ...
- 洛谷——P1781 宇宙总统
https://www.luogu.org/problem/show?pid=1781 题目背景 宇宙总统竞选 题目描述 地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人 ...