Android在无需配置Application的情况下全局获取Context的类的方式
程序员文章站
2023-01-23 08:23:08
使用 context 的场景就不必多说了,toast 啊、广播啊、通知啊等等等等,当然一般来说我们都是通过配置 application 来获取全局的上下文实例,这也是应有之义,这里也写一下好了:...
使用 context 的场景就不必多说了,toast 啊、广播啊、通知啊等等等等,当然一般来说我们都是通过配置 application 来获取全局的上下文实例,这也是应有之义,这里也写一下好了:
public class appcontext extends application { private static context instance; @override public void oncreate() { super.oncreate(); instance = getapplicationcontext(); } public static context getcontext() { return instance; } }
然后在 manifest 中 application 标签下添加 name 属性
android:name="xxx.xxx.xxx.appcontext"
一般而言就是上述这样了,接下来要说的是碰到一些特殊情况无法配置 application,这时要获取全局 context 该如何呢。
通过 applications 类获取全局上下文。
先上代码:
public class applications { @nonnull public static application context() { return current; } @suppresslint("staticfieldleak") private static final application current; static { try { object activitythread = getactivitythread(); object app = activitythread.getclass().getmethod("getapplication") .invoke(activitythread); current = (application) app; } catch (throwable e) { throw new illegalstateexception("can not access application context by magic code, boom!", e); } } private static object getactivitythread() { object activitythread = null; try { @suppresslint("privateapi") method method = class.forname("android.app.activitythread") .getmethod("currentactivitythread"); method.setaccessible(true); activitythread = method.invoke(null); } catch (final exception e) { log.w(tag, e); } return activitythread; } }
看起来很简单对不对,其实其中复杂程度很高,具体内容可以看一种android应用内全局获取context实例的装置这篇博文。
真看下去可以说收获颇多,如果只是使用的话直接取上面的 applications 类即可,无需经过任何初始化即可在全局获取 context 实例,当然有可能会与一些 hotfix 框架冲突,具体情况可在应用中自行查看。
至于我碰到的特殊情况,对,就是上篇文章中讲到的特麻烦结果最后才发现没必要的东西,因为要将项目 a 集成到项目 b中的话,a 的 manifest 中必然不能配置 application 标签,否则会造成冲突,此时这个类就显得尤为必要了!
上一篇: 茼蒿和莴苣有什么区别
下一篇: 苦菜根泡水喝的功效