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

6
回复
723
查看
[复制链接]

501

主题

1163

帖子

317

安币

手工艺人

发表于 2018-10-8 11:48:49 | 显示全部楼层 |阅读模式

        使用 Context 的场景就不必多说了,Toast 啊、广播啊、通知啊等等等等,当然一般来说我们都是通过配置 Application 来获取全局的上下文实例,这也是应有之义,这里也写一下好了:

[Java] 查看源文件 复制代码
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 属性

[Java] 查看源文件 复制代码
android:name="xxx.xxx.xxx.AppContext"

        一般而言就是上述这样了,接下来要说的是碰到一些特殊情况无法配置 Application,这时要获取全局 Context 该如何呢。


通过 Applications 类获取全局上下文。

        先上代码:

[Java] 查看源文件 复制代码
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 标签,否则会造成冲突,此时这个类就显得尤为必要了!


446

主题

1064

帖子

1990

安币

手工艺人

发表于 2018-10-8 12:00:54 | 显示全部楼层
感谢分享,楼主V5~

0

主题

9468

帖子

2471

安币

Android大神

Rank: 6Rank: 6

发表于 2018-10-8 12:54:36 | 显示全部楼层
楼主威武,以后多发干货,多办活动~!

11

主题

9403

帖子

982

安币

代码手工艺人

Rank: 4

发表于 2018-10-8 14:09:36 | 显示全部楼层
每次我都积极回帖的,想要安币~

14

主题

1万

帖子

3900

安币

码皇(巴士元老)

Rank: 8Rank: 8

发表于 2018-10-8 14:52:46 | 显示全部楼层
楼主是好人,回个帖会有安币吗?

501

主题

1168

帖子

2044

安币

手工艺人

发表于 2018-10-8 15:47:28 | 显示全部楼层
楼主威武,以后多发干货,多办活动~!

27

主题

9672

帖子

1873

安币

Android大神

Rank: 6Rank: 6

发表于 2018-10-8 16:47:02 | 显示全部楼层
感谢分享,楼主V5~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系我们
关闭
合作电话:
15618560077
Email:
805941275@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们
领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )