提问人:iCurious 提问时间:5/18/2012 最后编辑:N JiCurious 更新时间:1/10/2023 访问量:344105
getContext() , getApplicationContext() , getBaseContext() 和 “this” 之间的区别
Difference between getContext() , getApplicationContext() , getBaseContext() and "this"
问:
、、和“”有什么区别?getContext()
getApplicationContext()
getBaseContext()
this
虽然这是一个简单的问题,但我无法理解它们之间的基本区别。如果可能的话,请举一些简单的例子。
答:
View.getContext()
:返回当前运行视图的上下文。通常是当前处于活动状态的活动。Activity.getApplicationContext
():返回整个应用程序的上下文(所有 Activity 都在其中运行的进程) 的)。如果需要,请使用它而不是当前 Activity 上下文 上下文与整个应用程序的生命周期相关联,而不仅仅是 当前活动。ContextWrapper.getBaseContext()
:如果您需要从另一个上下文中访问上下文,请使用 ContextWrapper。这 从 ContextWrapper 内部引用的上下文通过 getBaseContext() 中。
评论
this
并且并不总是相同的,例如在 Activity 类中,您可以使用,因为继承自 但方法不在类中。 @mikedroid @KCRajugetContext()
this
Activity
Context
getContext()
Activity
this
给出它所在的类的实例,该类可以是任何类,不一定是上下文。如果在 Activity 类中使用它,则将是 .this
Context
Context
提供有关新创建的组件的 OR 的信息。Actvity
Application
应为新创建的组件(无论是应用程序上下文还是活动上下文)提供相关内容Context
由于是 的子类,因此可以使用它来获取该活动的上下文Activity
Context
this
getApplicationContext() - 返回应用程序中运行的所有活动的上下文。
getBaseContext() - 如果要从应用程序中的另一个上下文访问 Context,则可以访问。
getContext() - 仅返回当前正在运行的上下文视图活动。
从这个文档
我知道你应该使用:
尝试使用 context-application 而不是 context-activity
大多数答案已经涵盖了,但 getBaseContext() 很少被解释。getContext()
getApplicationContext()
该方法仅在您具有 .
Android 提供了一个类,该类是围绕现有创建的,使用:getBaseContext()
ContextWrapper
ContextWrapper
Context
ContextWrapper wrapper = new ContextWrapper(context);
使用 a 的好处是,它可以让你“在不改变原始上下文的情况下修改行为”。例如,如果您调用了一个名为 Activity,则可以创建与以下主题不同的 :ContextWrapper
myActivity
View
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()
getFilesDir()
ContextWrapper
getBaseContext() 方法可用于访问包装的“基本”上下文。您可能需要访问“基本”上下文,例如,检查它是否是 或 :ContextWrapper
Service
Activity
Application
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();
}
}
}
评论
ContextWrapper
getBaseContext()
ContextWrapper
CustomToast
“什么是上下文”这个问题是 Android 世界中最困难的问题之一。
上下文定义了访问系统资源、检索应用程序的静态资产、检查权限、执行 UI 操作等方法。从本质上讲,是生产中上帝对象反模式的一个例子。Context
当谈到我们应该使用哪种时,它变得非常复杂,因为除了作为上帝对象之外,子类的层次结构树残酷地违反了李斯科夫替换原则。Context
Context
这篇博文(现在来自 Wayback Machine)试图总结类在不同情况下的适用性。Context
为了完整起见,让我从该帖子中复制主表:
+----------------------------+-------------+----------+---------+-----------------+-------------------+ | | Application | Activity | Service | ContentProvider | BroadcastReceiver | +----------------------------+-------------+----------+---------+-----------------+-------------------+ | Show a Dialog | NO | YES | NO | NO | NO | | Start an Activity | NO¹ | YES | NO¹ | NO¹ | NO¹ | | Layout Inflation | NO² | YES | NO² | NO² | NO² | | Start a Service | YES | YES | YES | YES | YES | | Bind to a Service | YES | YES | YES | YES | NO | | Send a Broadcast | YES | YES | YES | YES | YES | | Register BroadcastReceiver | YES | YES | YES | YES | NO³ | | Load Resource Values | YES | YES | YES | YES | YES | +----------------------------+-------------+----------+---------+-----------------+-------------------+
- 应用程序可以从此处启动活动,但需要创建新任务。这可能适合特定的用例,但可能会在应用程序中创建非标准的后退堆栈行为,通常不建议或被视为良好做法。
- 这是合法的,但通货膨胀将使用您运行的系统的默认主题来完成,而不是应用程序中定义的主题。
- 如果接收器为 null(用于获取粘滞广播的当前值),则在 Android 4.2 及更高版本上允许。
getApplicationContext()
这用于应用程序级别,并引用所有活动。
getContext() 和 getBaseContext()
很可能是相同的,这些仅引用实时的当前活动。
这
始终引用当前类对象。
A 是:Context
- 一个抽象类,其实现由 Android 系统提供。
- 它允许访问特定于应用程序的资源和类,以及 对应用程序级操作(如启动活动)的向上调用, 广播和接收意图等。
this: 当前类对象
getContext():返回当前实时活动的上下文
getApplicationContext():返回应用程序中运行的所有活动
getApplicationContext() - 它返回应用程序中运行的所有活动的上下文。
getBaseContext() - 当您想从应用程序中的另一个上下文访问 Context 时,您可以访问。
getContext() - 它只返回上下文视图当前正在运行的活动。
this - 它指的是当前的类对象
这是指当前活动类对象,而活动继承上下文,因此必须在可以使用上下文或活动的地方使用它。
评论