在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对象的更多相关文章

  1. Application对象、ViewState对象、分页展示--2017年1月4日

    Application对象 存储 Application 变量  Application["application名称"] = "application的值"; ...

  2. JSP内置对象之application对象

    虽然常把Web应用称为B/S架构的应用,但其实Web应用一样是C/S结构的应用,只是这种应用的服务器是Web服务器,而客户端是浏览器. 现在抛开Web应用直接看Web服务器和浏览器. Web服务器负责 ...

  3. 什么是Cookie对象,Session对象,Application对象。

    Cookie是: 一个由网页服务器放在您硬盘上的非常小的文本文件. 它本质上就像您的身份证明一样,并且不能像代码那样被执行或被用来散布病毒.它只能被您使用并且只能由提供的服务器读取. 使用Cookie ...

  4. Application对象、Session对象、Cookie对象、Server对象初步认识

    Application对象:记录应用程序参数的对象 用于共享应用程序级信息,即多个用户共享一个Application对象.在第一个用户请求ASP.NET文件时,将启动应用程序并创建Applicatio ...

  5. Android Application 对象介绍

    What is Application Application和Actovotu,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application ...

  6. ASP.NET中application对象的用法

    一.Application对象的理解 Application对象在实际网络开发中的用途就是记录整个网络的信息,如上线人数.在线名单.意见调查和网上选举等.在给定的应用程序的多有用户之间共享信息,并在服 ...

  7. [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. ASP.NET中application对象

    ASP.NET中application对象的使用. Application对象的应用  1.使用Application对象保存信息  (1).使用Application对象保存信息  Applicat ...

  9. 初识 Asp.Net内置对象之Application对象

    Application对象 Applocation对象用于共享应用程序级信息,即多个用户可以共享一个Applocation对象. 用户在请求Asp.Net文件时,将启动应用程序并且创建Applicat ...

随机推荐

  1. Python的正则表达概述

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优化正则表达式,这些主题请查看其他教程 ...

  2. poj3244(公式题)

    Difference between Triplets Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 2476   Acce ...

  3. unity3d编程日志

    2014/4/27 编写脚本的时候,加入了中文凝视,发现console面板有非常多不可思议的bug.查了一下发现是由于monodevelop脚本中文凝视报错,而英文凝视不会受影响. 解决方法:把凝视放 ...

  4. java移位操作符注意的问题

    如果对char,byte或者short类型的数值进行移位处理,那么在移位进行之前,他们会被转为int类型, 并且所得到的结果也是一个int型. 若对long类型的数值进行处理所得到的结果也是long. ...

  5. Eclipse&STS常用小技巧

    开发是经常用到的代码可进行快捷提示,比如mian alt+/就提示出了main方法是不是很方便,为什么就能提示出来呢? 马上来了: 在你使用的java开发工具中点击Window--->Prefe ...

  6. File Upload with Jersey

    package com.toic.rest; import java.io.File; import java.io.FileOutputStream; import java.io.IOExcept ...

  7. Linux的一些简单命令操作

    防火墙 查看防火墙状态 systemctl status iptables (或service iptables status) 关闭防火墙 systemctl stop iptables(或serv ...

  8. 洛谷——P1540 机器翻译

    https://www.luogu.org/problem/show?pid=1540#sub 题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的 ...

  9. 原生js大总结四

    031.数组常用的一些方法   1.push: 在数组最后添加一个或者多个元素,返回添加后数组的长度   2.pop: 从数组最后取出一个元素,返回的是数组的最后一个元素(取出的元素)   3.uns ...

  10. 00099_commons-IO

    1.导入classpath (1)加入classpath的第三方jar包内的class文件才能在项目中使用: (2)创建lib文件夹: (3)将commons-io.jar拷贝到lib文件夹: (4) ...