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;

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

  • 相关阅读:
    解决laravel 429请求错误
    laravel的Validation检索验证错误消息
    Laravel通过用户名和密码查询
    Javascript 利用 switch 语句进行范围判断
    解决SourceTree每次拉取提交都需要输入密码的问题
    nginx ip配置反向代理为本地域名
    Linux top命令详解
    《Inside C#》笔记(六) 属性、数组、索引器
    《Inside C#》笔记(五) 方法
    《Inside C#》笔记(四) 类
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7049255.html
Copyright © 2011-2022 走看看