欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android在无需配置Application的情况下全局获取Context的类的方式

程序员文章站 2022-05-04 10:15:53
使用 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 标签,否则会造成冲突,此时这个类就显得尤为必要了!