getContext()
、getApplicationContext()
、getBaseContext()
和“this
”之间有什么区别?
虽然这是一个简单的问题,但我无法理解它们之间的基本区别。如果可能,请举一些简单的例子。
大多数答案已经涉及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();
}
}
}
>
view.getContext()
:返回视图当前运行的上下文。通常是当前活跃的activity。
activity.getApplicationContext()
:返回整个应用程序(所有活动都在其中运行的进程)的上下文。如果您需要一个与整个应用程序的生命周期绑定的上下文,而不仅仅是当前的activity,请使用这个上下文,而不是当前的activity上下文。
ContextWrapper.getBaseContext()
:如果需要从另一个上下文中访问上下文,可以使用ContextWrapper。从ContextWrapper内部引用的上下文通过getBaseContext()访问。
、、和“”有什么区别? 虽然这是一个简单的问题,但我无法理解它们之间的基本区别。如果可能的话,请给出一些简单的例子。
我想显示消息,但是中的出现错误
在为Android开发的Eclipse Java中······ 正如您所看到的,我根本无法获得应用程序或基本上下文。试图在没有它们的情况下获得文件目录是行不通的。我到底如何访问我的文件目录?
在swift中似乎有两个相等运算符:双相等()和三相等(),这两者有什么区别?
getApplicationContext()和getActivity()与Android中的区别是什么?