📜  Android中的上下文是什么?

📅  最后修改于: 2021-05-13 15:24:43             🧑  作者: Mango

Android应用很久以来一直很流行,并且随着用户期望他们需要以更轻松,更流畅的视图查看所需数据的程度,它正在发展到更高的水平。因此,Android开发人员在开发应用程序之前必须了解重要的术语。在Android编程中,我们通常会遇到单词上下文。那么,这种情况到底是什么?为什么它如此重要?要回答这个问题,首先让我们看看上下文的字面量意思是什么:

查看此定义,我们会遇到两件事:

  • 上下文告诉我们有关周围的信息。
  • 了解我们想要了解的环境非常重要。

类似地,当我们谈论Android编程上下文时,可以理解为上下文,它为我们提供了应用程序当前状态的上下文。我们可以将上下文及其用法分为三个主要方面:

  • 它允许我们访问资源。
  • 它允许我们通过发送消息与其他Android组件进行交互。
  • 它为您提供有关您的应用程序环境的信息。

在Android官方文档中,上下文定义为:

通过实际示例了解上下文

我们一个人去旅馆。他需要在适当的时候吃早餐,午餐和晚餐。除了这些事情外,他还想在下榻期间做其他事情。那么他如何得到这些东西呢?他会请客房服务人员为他带来这些东西。正确的?所以这里 考虑到您是单身活动而酒店则是您的应用程序,因此客房服务人员是的背景,最后早餐,午餐和晚餐必须作为资源

这是怎么工作的?

1.它是应用程序当前/活动状态的上下文。

通常,该应用具有多个屏幕,例如显示/查询/添加/删除屏幕(基本应用的一般要求)。因此,当用户正在搜索内容时,在这种情况下,上下文是一个查询屏幕。

2.用于获取有关活动和应用程序的信息。

查询屏幕的上下文指定用户处于查询活动中,并且他/她可以提交与该应用程序相关的查询

3.用于访问资源,数据库和共享首选项等。

通过Rest服务,可以在android应用中使用API调用。 Rest Services通常会保存数据库数据,并将JSON格式的输出提供给android应用。各个屏幕的上下文有助于获取数据库数据和跨屏幕的共享数据

4. Activity和Application类都扩展了Context类。

在android中,上下文是主要的重要概念,对上下文的错误使用会导致内存泄漏。活动是指单个屏幕,应用程序是指整个应用程序,并且两者都扩展了上下文类。

Android中的上下文类型

Android主要提供两种类型的上下文。

  1. 应用上下文和
  2. 活动背景

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的好处是,它可以让您“在不更改原始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()
想要一个节奏更快,更具竞争性的环境来学习Android的基础知识吗?
单击此处,前往由我们的专家精心策划的指南,以使您立即做好行业准备!