Android应用很久以来一直很流行,并且随着用户期望他们需要以更轻松,更流畅的视图查看所需数据的程度,它正在发展到更高的水平。因此,Android开发人员在开发应用程序之前必须了解重要的术语。在Android编程中,我们通常会遇到单词上下文。那么,这种情况到底是什么?为什么它如此重要?要回答这个问题,首先让我们看看上下文的字面量意思是什么:
The circumstances that form the setting for an event, statement, or idea, and in terms of which it can be fully understood
查看此定义,我们会遇到两件事:
- 上下文告诉我们有关周围的信息。
- 了解我们想要了解的环境非常重要。
类似地,当我们谈论Android编程上下文时,可以理解为上下文,它为我们提供了应用程序当前状态的上下文。我们可以将上下文及其用法分为三个主要方面:
- 它允许我们访问资源。
- 它允许我们通过发送消息与其他Android组件进行交互。
- 它为您提供有关您的应用程序环境的信息。
在Android官方文档中,上下文定义为:
Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.
通过实际示例了解上下文
我们一个人去旅馆。他需要在适当的时候吃早餐,午餐和晚餐。除了这些事情外,他还想在下榻期间做其他事情。那么他如何得到这些东西呢?他会请客房服务人员为他带来这些东西。正确的?所以这里 考虑到您是单身活动,而酒店则是您的应用程序,因此客房服务人员是您的背景,最后,早餐,午餐和晚餐必须作为资源。
这是怎么工作的?
1.它是应用程序当前/活动状态的上下文。
通常,该应用具有多个屏幕,例如显示/查询/添加/删除屏幕(基本应用的一般要求)。因此,当用户正在搜索内容时,在这种情况下,上下文是一个查询屏幕。
2.用于获取有关活动和应用程序的信息。
查询屏幕的上下文指定用户处于查询活动中,并且他/她可以提交与该应用程序相关的查询
3.用于访问资源,数据库和共享首选项等。
通过Rest服务,可以在android应用中使用API调用。 Rest Services通常会保存数据库数据,并将JSON格式的输出提供给android应用。各个屏幕的上下文有助于获取数据库数据和跨屏幕的共享数据
4. Activity和Application类都扩展了Context类。
在android中,上下文是主要的重要概念,对上下文的错误使用会导致内存泄漏。活动是指单个屏幕,应用程序是指整个应用程序,并且两者都扩展了上下文类。
Android中的上下文类型
Android主要提供两种类型的上下文。
- 应用上下文和
- 活动背景
App层次结构的总体视图如下所示:
从上图中可以看出,在“示例应用程序”中,最接近的上下文是应用程序上下文。在“ Activity1”和“ Activity2”中,活动上下文(这里是活动1的活动1上下文和活动2的活动2上下文)和应用程序上下文。两者最接近的上下文仅是它们的活动上下文。
应用环境
该上下文与应用程序的生命周期相关。主要是一个单例实例,可以通过getApplicationContext()访问。应用程序上下文的一些用例是:
- 如果有必要创建一个单例对象
- 在活动中需要图书馆时
getApplicationContext():
它用于返回链接到应用程序的上下文,该应用程序包含在其中运行的所有活动。当我们调用方法或构造函数时,我们通常必须传递上下文,并且经常使用“ this”传递活动上下文或“ getApplicationContext”传递应用程序上下文。此方法通常用于应用程序级别,并且可以用于引用所有活动。例如,如果我们要在整个android应用程序中访问变量,则必须通过getApplicationContext()使用它。
例子:
Java
import android.app.Application;
public class GlobalExampleClass extends Application
{
private String globalName;
private String globalEmail;
public String getName()
{
return globalName;
}
public void setName(String aName)
{
globalName = aName;
}
public String getEmail()
{
return globalEmail;
}
public void setEmail(String aEmail)
{
globalEmail = aEmail;
}
}
Java
// Activity 1
public class extends Activity {
........
........
private globarVar;
........
@Override
public void onCreate(Bundle savedInstanceState) {
.......
final GlobalExampleClass globalExampleVariable = (GlobalExampleClass) getApplicationContext();
// In this activity set name and email and can reuse in other activities
globalExampleVariable.setName("getApplicationContext example");
globalExampleVariable.setEmail("xxxxxx@gmail.com");
.......
}
// Activity 2
public class extends Activity {
........
........
private globarVar;
.......
@Override
public void onCreate(Bundle savedInstanceState) {
.......
final GlobalExampleClass globalExampleVariable = (GlobalExampleClass) getApplicationContext();
// As in activity1, name and email is set, we can retrieve it here
final String globalName = globalExampleVariable.getName();
final String globalEmail = globalExampleVariable.getEmail();
.......
}
Java
@Override
public void onItemClick(AdapterView> parent, View view, int pos, long id) {
....
// view.getContext() refers to the current activity view
// Here it is used to start the activity
Intent intent = new Intent(view.getContext(), .class);
intent.putExtra(pid, ID);
view.getContext().startActivity(intent);
}
Java
public (Context ctx) {
// if the context is instanceof ContextWrapper
while (ctx instanceof ContextWrapper) {
// use getBaseContext()
final Context baseContext = ((ContextWrapper)context).getBaseContext();
if (baseContext == null)
{
break;
}
// And then we can assign to context and reuse that
ctx = baseContext;
}
.....
}
Java
// Show a simple toast message, that can be done after doing some activities
// Toast.makeText(this, "Action got completed", Toast.LENGTH_SHORT).show();
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class ExampleActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_example);
// Displaying Toast with Hello Javatpoint message
Toast.makeText(this,"Action done",Toast.LENGTH_SHORT).show();
}
}
Java
public class FirstActivity extends AppCompatActivity {
public static final String New_Message = "Your message to go for next screen";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
}
// There must be some button and on click of
// that below method can be invoked
public void sendMessageToNextScreen(View view) {
// Here it is used with "this"
Intent intent = new Intent(this, SecondActivity.class);
EditText editText = (EditText) findViewById(R.id.editText);
String message = editText.getText().toString();
intent.putExtra(New_Message, message);
// Start the SecondActivity
startActivity(intent);
}
}
在活动类中,设置GlobalExampleClass的名称和电子邮件,可以从另一个活动中访问它。让我们通过以下步骤进行查看。
Java
// Activity 1
public class extends Activity {
........
........
private globarVar;
........
@Override
public void onCreate(Bundle savedInstanceState) {
.......
final GlobalExampleClass globalExampleVariable = (GlobalExampleClass) getApplicationContext();
// In this activity set name and email and can reuse in other activities
globalExampleVariable.setName("getApplicationContext example");
globalExampleVariable.setEmail("xxxxxx@gmail.com");
.......
}
// Activity 2
public class extends Activity {
........
........
private globarVar;
.......
@Override
public void onCreate(Bundle savedInstanceState) {
.......
final GlobalExampleClass globalExampleVariable = (GlobalExampleClass) getApplicationContext();
// As in activity1, name and email is set, we can retrieve it here
final String globalName = globalExampleVariable.getName();
final String globalEmail = globalExampleVariable.getEmail();
.......
}
因此,只要在整个应用程序中需要变量作用域,我们都可以通过getApplicationContext()来获取它。以下是应用程序上下文的功能列表。
应用程序上下文功能列表:
- 加载资源值
- 启动服务
- 绑定到服务
- 发送广播
- 注册广播接收器
活动背景
这是活动上下文,意味着每个屏幕都有一个活动。例如,EnquiryActivity仅指EnquiryActivity,而AddActivity仅指AddActivity。它与活动的生命周期息息相关。它用于当前上下文。调用活动上下文的方法是getContext() 。
活动上下文的一些用例是:
- 用户正在创建其生命周期附加到活动的对象。
- 每当在与用户界面相关的活动(如吐司,对话等)中进行活动时,
getContext():
它返回链接到其被调用的Activity的Context。当我们只想从当前正在运行的活动中调用上下文时,这很有用。
例子:
Java
@Override
public void onItemClick(AdapterView> parent, View view, int pos, long id) {
....
// view.getContext() refers to the current activity view
// Here it is used to start the activity
Intent intent = new Intent(view.getContext(), .class);
intent.putExtra(pid, ID);
view.getContext().startActivity(intent);
}
活动上下文功能列表:
- 加载资源值
- 布局通货膨胀
- 开始活动
- 显示对话框
- 启动服务
- 绑定到服务
- 发送广播
- 注册广播接收器
从Application和Activity的功能上,我们可以看到不同之处在于Application Context与UI无关。它仅应用于启动服务或加载资源值等。除了getApplicationContext()和getContext() , getBaseContext()或这是整个应用程序开发中使用的不同术语。让我们看一个例子
getBaseContext():
基本上下文由构造函数或setBaseContext()设置。仅当我们有ContextWrapper时,此方法才有效。 Android提供了一个ContextWrapper类,该类是使用以下内容围绕现有Context创建的:
ContextWrapper wrapper = new ContextWrapper(context);
使用ContextWrapper的好处是,它可以让您“在不更改原始Context的情况下修改行为”
例子:
Java
public (Context ctx) {
// if the context is instanceof ContextWrapper
while (ctx instanceof ContextWrapper) {
// use getBaseContext()
final Context baseContext = ((ContextWrapper)context).getBaseContext();
if (baseContext == null)
{
break;
}
// And then we can assign to context and reuse that
ctx = baseContext;
}
.....
}
这:
“ this”参数的类型为“ Context”。为了解释这种情况,让我们举一个使用“ this”显示Toast消息的示例。
例子:
Java
// Show a simple toast message, that can be done after doing some activities
// Toast.makeText(this, "Action got completed", Toast.LENGTH_SHORT).show();
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class ExampleActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_example);
// Displaying Toast with Hello Javatpoint message
Toast.makeText(this,"Action done",Toast.LENGTH_SHORT).show();
}
}
输出:
使用“ this”开始活动的另一个示例:
Java
public class FirstActivity extends AppCompatActivity {
public static final String New_Message = "Your message to go for next screen";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
}
// There must be some button and on click of
// that below method can be invoked
public void sendMessageToNextScreen(View view) {
// Here it is used with "this"
Intent intent = new Intent(this, SecondActivity.class);
EditText editText = (EditText) findViewById(R.id.editText);
String message = editText.getText().toString();
intent.putExtra(New_Message, message);
// Start the SecondActivity
startActivity(intent);
}
}
文件参考:
- https://developer.android.com/reference/android/content/Context
- https://developer.android.com/reference/android/content/Context#getApplicationContext()