当前位置: 首页 > 知识库问答 >
问题:

getContext()、getApplicationContext()、getBaseContext()与“this”之间的差异

荆学民
2023-03-14

getContext()getApplicationContext()getBaseContext()和“this”之间有什么区别?

虽然这是一个简单的问题,但我无法理解它们之间的基本区别。如果可能,请举一些简单的例子。

共有2个答案

施超
2023-03-14

大多数答案已经涉及getContext()getApplicationContext(),但很少解释getBaseContext()。

getBaseContext()方法仅在具有ContextWrapper时才相关。Android提供了一个ContextWrapper类,它是围绕现有的Context创建的,使用:

ContextWrapper wrapper = new ContextWrapper(context);

使用ContextWrapper的好处是,它允许您“在不更改原始上下文的情况下修改行为”。例如,如果您有一个名为MyActivity的activity,则可以创建一个主题与MyActivity不同的视图:

ContextWrapper customTheme = new ContextWrapper(myActivity) {
  @Override
  public Resources.Theme getTheme() { 
    return someTheme;
  }
}
View myView = new MyView(customTheme);

ContextWrapper功能非常强大,因为它允许您重写Context提供的大多数函数,包括访问资源的代码(例如OpenFileInput()GetString())、与其他组件交互(例如SendBroadcast()RegisterReceiver())、请求权限(例如CheckCallingOrselfPermission())和解析文件系统位置的代码(例如contextwrapper对于解决设备/版本特定的问题或对需要上下文的组件(如视图)应用一次性自定义非常有用。

方法getBaseContext()可用于访问ContextWrapper环绕的“基本”上下文。例如,如果需要检查“基本”上下文是服务activity还是应用程序,则可能需要访问“基本”上下文:

public class CustomToast {
  public void makeText(Context context, int resId, int duration) {
    while (context instanceof ContextWrapper) {
      context = context.baseContext();
    }
    if (context instanceof Service)) {
      throw new RuntimeException("Cannot call this from a service");
    }
    ...
  }
}

或者如果需要调用方法的“未包装”版本:

class MyCustomWrapper extends ContextWrapper {
  @Override
  public Drawable getWallpaper() {
    if (BuildInfo.DEBUG) {
      return mDebugBackground;
    } else {
      return getBaseContext().getWallpaper();
    }
  }
}
陆浩博
2023-03-14

>

  • view.getContext():返回视图当前运行的上下文。通常是当前活跃的activity。

    activity.getApplicationContext():返回整个应用程序(所有活动都在其中运行的进程)的上下文。如果您需要一个与整个应用程序的生命周期绑定的上下文,而不仅仅是当前的activity,请使用这个上下文,而不是当前的activity上下文。

    ContextWrapper.getBaseContext():如果需要从另一个上下文中访问上下文,可以使用ContextWrapper。从ContextWrapper内部引用的上下文通过getBaseContext()访问。

  •  类似资料: