使用 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 标签,否则会造成冲突,此时这个类就显得尤为必要了!
使用 Context 的场景就不必多说了,Toast 啊、广播啊、通知啊等等等等,当然一般来说我们都是通过配置 Application 来获取全局的上下文实例,这也是应有之义,这里也写一下好了:public class AppContext extends Application { private static Context instance; @Ove...
本篇文章介绍如何得到
Application context。一般来说,我们有以下方法,
1. 继承
Application类
我们知道,
Application类是唯一的,我们可以继承该
类,并将
context保存在内部,然后在需要的时候,返回就可以了。代码如下,
public class My
Application extends
Application {
private static
Context context;
public void onCreate() {
android学了快一年了,也写了一些代码,但是经常使用的application和context只是会简单的时候,有时候遇到问题也不知道为什么,最近上网查看了各种博客,对application和context有了一点了解,整理了一些资料,供大家探讨学习。
一、application
1、application是什么
Application是android系
除了经常在Application中设置全局的application对象之外
还可以通过反射来获取
在ActivityThread类中,有一个currentApplication方法,返回的正是当前application的对象
Application mApplication = Class.forName(“android.app.ActivityThread”).getMethod(“curre...
在我们平时学习很多地方需要用到Context,比如弹出Toast,启动Activity的时候需要,发送广播的时候,操作数据库需要。。。。。。
我们之前不考虑这个问题,是因为我们很多操作是在Activity中进行的,而Activity本身就是一个Context对象。
当我们学习到的架构越来越复杂的时候,逻辑代码脱离Activity类的时候,而你又需要用到Context的时候,你就会产生疑惑?
解决方法:
Android提供了一个Application类,每当应用启动的时候,系统就会自动将这个类进行初始化。而我
1. 在 Activity 中,可以直接使用 `this` 关键字
获取 Context。
2. 在 Fragment 中,可以通过 `get
Context()` 方法
获取 Context。
3. 在自定义 View 中,可以通过重写 `View`
类的构造函数,并将
Context 作为参数传入来
获取 Context。
4. 在 Service 或 BroadcastReceiver 中,可以通过 `get
ApplicationContext()` 方法
获取全局 Context。
需要注意的是,如果
获取的
Context 是 Activity 的
Context,使用时需要注意内存泄漏问题,避免在 Activity 销毁后仍然持有该
Context。建议使用
Application Context 或
Application 对象来代替 Activity
Context。