随手可得的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;

可以肯定,这不是唯一的方法,大家有什么好的方式,欢迎分享。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-15 01:16:50

随手可得的Application对象的相关文章

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

Cookie是: 一个由网页服务器放在您硬盘上的非常小的文本文件. 它本质上就像您的身份证明一样,并且不能像代码那样被执行或被用来散布病毒.它只能被您使用并且只能由提供的服务器读取. 使用Cookie的目的是: 告诉服务器您再次的访问该服务器. Cookie能为您做什么?: 帮您节约时间.如果您自定义页面,或注册产品或服务.cookie帮助微软记住您的身份.当下一次您再次访问的时候,我们将显示您需要的信息.或者当您注册另一个产品或服务的时候,您只需要键入您的E-mail和密码.我们将帮您填入任何

带你认识ASP Application 对象

ASP Application 对象 Previous Page Next Page 在一起协同工作以完成某项任务的一组 ASP 文件称作应用程序 (application).ASP 中的 Application 对象用于将这些文件捆绑在一起. Application 对象 web 上的一个应用程序可以是一组 ASP 文件.这些 ASP 文件一起协同工作来完成某项任 务.ASP 中的 Application 对象用来把这些文件捆绑在一起. Application 对象用于存储和访问来自任何页面的

什么是Cookie对象,Session对象,Application对象等问题

1.什么是Cookie对象,Session对象,Application对象 Application对象应用程序状态:Web 应用程序的所有用户都可以访问该应用程序的状态信息Session对象,会话状态:只有特定会话中的用户可以访问该信息不同的用户正在使用某个应用程序,则每个用户都将有一个不同的会话状态客户端状态管理:Cookie对象Cookie:使用文本文件存储信息来维护状态Cookie对象也可以保存客户信息,与Session 对象相似,分别保存不同用户的信息.和Session的区别是:Sess

什么是Cookie对象,Session对象,application对象?

(1)Cookie对象是: 一个由网页服务器放在您硬盘上的非常小的文本文件. 它本质上就像您的身份证明一样,并且不能像代码那样被执行或被用来散布病毒.它只能被您使用并且只能由提供的服务器读取. 使用Cookie的目的是: 告诉服务器您再次的访问该服务器. Cookie能为您做什么?: 帮您节约时间.如果您自定义页面,或注册产品或服务.cookie帮助微软记住您的身份.当下一次您再次访问的时候,我们将显示您需要的信息.或者当您注册另一个产品或服务的时候,您只需要键入您的E-mail和密码.我们将帮

Application对象

11.1  Application对象 Application对象生存期和Web应用程序生存期一样长,生存期从Web应用程序网页被访问开始,HttpApplication类对象Application被自动创建,直到没有一个网页被访问时结束,Application对象被自动撤销.因此Application对象中的变量也有相同生存期,并且变量可以被Web应用程序中的所有网页访问.因此,可以在Application对象中建立一些全局的公用变量,由于存储在Application对象中的数值可以被应用程序

jsp 用application对象制作留言板

1 <%@ page contentType="text/html; charset=gb2312"%> 2 <html> 3 <body> 4 <form action="show.jsp" method="post"> 5 输入名字:<input type="text" name="name"><br> 留言标题:<input

Struts2中获取Web元素request、session、application对象的四种方式

我们在学习web编程的时候,一般都是通过requet.session.application(servletcontext)进行一系列相关的操作,request.session.和application他们都是web开发最常用和最实用的对象,有了它们可以大大方便开发人员进行开发和操作.但是在struts2中,基本都是action,这些个方法都是没有requet.session.application,所以如何获取这几个常用对象,也成了大家都比较关注的问题,下面我就来演示下,如何在struts2中

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

Application对象 存储 Application 变量  Application["application名称"] = "application的值"; 取回 Application 变量 string str = Application["application名称"]; 常用的属性和方法 All 返回全部的Application对象变量到一个对象数组   AllKeys 返回全部的Application对象变量到一个字符串数组   C

【VBA编程】11.Application对象

Application对象常用属性[ActiveCell属性]ActiveCell属性返回一个Range对象,表示当前窗口或指定窗口中的单元格.如果窗口没显示工作表,则此属性无效.[代码区域] Sub 激活单元格() Worksheets("sheet1").Activate '激活当前单元格 With ActiveCell .Value = "娑娜" With .Font .Bold = True '设置为粗体 .Italic = True '设置为斜体 .Siz