zoukankan      html  css  js  c++  java
  • 随手可得的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;

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

  • 相关阅读:
    SSAS没有注册类别 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG)) 解决办法
    Javascript中暂停功能的实现
    【转】JQuery ajax json 实例
    SqlDataAdapter有关InsertCommand,UpdateCommand,DeleteCommand 实例
    绑定数组对象DataTable.Select返回值DataRow[]
    SQL SERVER 联想函数重写
    JQuery Dialog(转)
    温习C 文件操作
    轻松掌握Windows窗体间的数据交互
    反射方法调用时的一个错误:参数计数不匹配( parameter count mismatch )
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7049255.html
Copyright © 2011-2022 走看看