Android 中 getContext()、getApplicationContext()、getBaseContext() 和 this 的区别?


什么是 Android 中的 Context?

Context 为我们提供了有关应用程序当前状态的信息。它允许我们与 Android 组件进行交互。它允许我们访问文件和其他资源,例如图片、Activity、Fragment 和 Service。在 Android 中,getContext()、getApplicationContext()、getBaseContext()、this 是检索不同类型 Context 对象的方法。Context 类提供对构建 Android 应用程序所需的多种资源和服务的访问,包括 -

  • 资源 - 通过 Context 访问存储在资源对象中的资源,例如布局、图像和字符串。

  • 系统服务 - 它提供对系统服务的访问,例如电源管理器、通知管理器和位置管理器。

  • 偏好设置 - 偏好设置用于存储和检索键值对中的数据,可以通过 Context 访问。

  • 资产管理器 - 它用于访问与应用程序打包在一起的原始资产文件。

  • 数据库 - 它提供对应用程序使用的数据库的访问。

Context 有哪两种类型?

Context 有两种类型,如下所示 -

  • Activity Context

  • Application Context

在 Android 中,“Activity” 和“Application” 都是“Context” 类的子类,它提供对特定于应用程序的资源和类的访问。

这两个上下文的主要区别在于,“Activity” 上下文与“Activity” 的生命周期相关联,而“Application” 上下文与整个应用程序的生命周期相关联。

什么是 Android 中的 getContext()?

getContext() 方法通常与 Activity 和 Fragment 一起使用,以检索视图的上下文。Context 表示应用程序或 Activity 的当前状态,它提供对各种资源的访问,例如字符串、图像等等。getContext() 可以从任何 View 中调用,包括 Button 视图、Text 视图或 Image 视图。

以下是在 Android 应用程序中使用 getContext() 的方法

 public class CustomView extends View {
   public CustomView(Context context) {
       super(context);
   }
   public void displayToastMessage() {
       // Get the context associated with this view
       Context context = getContext();
       // Use the context to access resources from string.xml file.
       String message = context.getString(R.string.my_message);
       // Using the context to display the toast message.
       Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
   }
}

什么是 Android 中的 getApplicationContext()?

getApplicationContext() 是 Context 类提供的方法。Context 表示对象的当前状态。getApplicationContext() 可以从任何Activity、Service、BroadcastReceiverContentProvider 中调用以检索全局应用程序 Context。此方法可以在应用程序的多个组件中安全地使用。

以下是在 Android 应用程序中使用 getApplicationContext() 的方法

public class MyApp extends Application {
   @Override
   public void onCreate() {
       super.onCreate();
       // Get the global application context
       Context context = getApplicationContext();
       // Use the context to access strings.xml file.
       String message = context.getString(R.string.my_message);
       //Using the context to display the toast message on below line.
       Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
   }
}

什么是 Android 中的 getBaseContext()?

getBaseContext() 是 ContextWrapper 类提供的方法,它返回当前上下文的基上下文。getBaseContext() 可以从任何Activity、Service、BroadcastReceiverContentProvider 中调用以检索全局应用程序 Context。该方法返回一个 Context 对象,可用于访问应用程序中的资源或服务。

以下是在 Android 应用程序中使用 getBaseContext() 的方法

getBaseContext() 返回的 Context 用作 Activity 或 Service 的基上下文。您可以安全地使用它来访问与 Activity 和 Service 关联的资源或服务。

public class MyApp extends AppCompatActivity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       // Get the base context of this activity on below line.
       Context context = getBaseContext();
       // Use the context to get data from strnig.xml file
       String message = context.getString(R.string.my_message);
       // using the context to display toast message on below line.
       Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
   }
}

什么是 Android 中的 this?

this 是 Android 中的一个关键字,用于获取我们当前所在的类的上下文。无需获取上下文,我们可以简单地使用此关键字,它将提供该类的上下文。

以下是在 Android 应用程序中使用 this 的方法

在此示例中,我们不是获取存储在变量中的上下文,而是简单地将其作为 this 传递以显示吐司消息。

  public class MyApp extends AppCompatActivity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
      Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
   }
}

getContext()、getApplicationContext()、getBaseContext() 和 this 的区别

getApplicationContext()

getBaseContext()

getContext()

this

定义

getApplicationContext() 返回应用程序的全局上下文。

getBaseContext() 返回整个应用程序的上下文。

getContext() 返回当前 Activity 的上下文。

this 用于引用当前 Activity。

父级

应用程序

应用程序

Activity

Activity

在服务外部可访问

在内容提供程序外部可访问

在 Activity 外部可访问

结论

总而言之,getContext() 返回当前 View 或 Fragment 的 Context,getApplicationContext() 返回应用程序的 Context,getBaseContext() 返回 ContextWrapper 的 Context,而 this 返回当前类的上下文。根据您正在工作的上下文选择正确的方法非常重要,因为使用错误的方法会导致内存泄漏或其他问题。

更新于: 2023年5月8日

2K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告