通过反射获取Application上下文

Android AUmaWSsSoi 5个月前 (04-23) 116次浏览 0个评论
文章目录[隐藏]

问题:

有些场景下,比如组件化,我们拿不到Application上下文,但是呢,我们非得要用上这个东西。可以考虑通过反射获取到Application。

解决办法:

public class AppUtils {
    private static final String TAG = "AppUtils";
    public static final Application application;

    static {
        Application app = null;
        try {
            app = (Application) Class.forName("android.app.AppGlobals").getMethod("getInitialApplication").invoke(null);
            if (app == null)
                throw new IllegalStateException("Static initialization of Applications must be on main thread.");
        } catch (final Exception e) {
            Log.e(TAG, "Failed to get current application from AppGlobals." + e.getMessage());
            try {
                app = (Application) Class.forName("android.app.ActivityThread").getMethod("currentApplication").invoke(null);
            } catch (final Exception ex) {
                Log.e(TAG, "Failed to get current application from ActivityThread." + e.getMessage());
            }
        } finally {
            application = app;
        }
    }
}

 

封装工具类的时候,为了偷懒,不想传递context上下文,就可以参考下面的方式。

public class DisplayUtils {
    /**
     * dp2px
     */
    public static int dip2px(float dpValue) {
        final float scale = AppUtils.application.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
}

java问与答 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:http://javaexception.com/archives/53
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址