当前位置: 移动技术网 > IT编程>移动开发>Android > Android在无需配置Application的情况下全局获取Context的类的方式

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

2018年09月14日  | 移动技术网IT编程  | 我要评论

解脱mm小游戏,斯诺克世锦赛奖金,北京电影院排片表

使用 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 标签,否则会造成冲突,此时这个类就显得尤为必要了!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网