Android和PHP开发最佳实践(第2版)
上QQ阅读APP看书,第一时间看更新

2.5 Android上下文

大家对上下文(Context)的概念并不陌生,在软件开发领域,它主要用于存储进程或应用运行时的资源和对象的引用,此外,我们在接触其他系统和框架的时候也经常会碰到上下文的概念。当然,对于Android应用来说,上下文是非常重要的,这部分的内容在Android应用的实际开发中也会经常使用到,因此本节将会重点介绍Android上下文的相关知识,为后面实战编程打下一定的基础。

在Android应用框架中,根据作用域的不同,可以把上下文分为两种,一种是Activity界面的上下文,即Activity Context;另一种是Android应用的上下文,即Application Context。下面我们分别介绍这两种上下文的概念和使用。

2.5.1 界面上下文(Activity Context)

界面上下文(Activity Context)在应用界面(Activity)启动的时候被创建,主要用于保存对当前界面资源的引用。界面上下文在Activity界面控制器类中被使用,当我们需要加载或者访问Activity相关的资源时,会需要用到该Activity的上下文对象。比如,我们需要在界面中创建一个控件,示例代码如清单2-10所示。

代码清单 2-10

public class TestActivity extends Activity {
...
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       TextView mTextView = new TextView(this);
       label.setText("Test Text View");
       setContentView(mTextView);
    }
...
}

通过上面的代码片断,我们创建了一个文本框控件(TextView),并赋予该控件对应界面控制器(TestActivity)的上下文对象(this)。实际上,把界面控制器的上下文对象传递给控件,就意味着该控件拥有一个指向该界面对象的引用,可以引用界面对象占有的资源;同时,Android界面系统也将该控件绑定到该上下文指向的界面对象,最终组合并展示出来。

界面上下文(Activity Context)的生命周期跟Activity界面的是同步的,即当Activity被销毁的时候,其对应的上下文也被销毁了,同时,和该上下文有关的控件对象也将被销毁并回收。因此,我们也可以认为上下文可以用于串联Android应用之中的对象和组件,在理解了这点之后,在使用上下文的时候就不会迷惑了。此外,Context类中比较常用的方法如下。

·getApplicationContext:获取当前应用的上下文对象,相关内容请参考2.5.2节。

·getApplicationInfo:获取当前应用的完整信息并存于ApplicationInfo对象中,其中常用的信息包括包名packageName、图标icon以及权限permission等属性,更多属性可参考SDK中android.content.pm.ApplicationInfo类的说明。

·getContentResolver:获取ContentResolver对象,用于查询所需的Content Provider提供的信息,更多知识请参考2.4.4节内容。

·getPackageManager:获取PackageManager对象,PackageManager的用途比Application-Info更加广泛,该类可以从系统的PackageManagerService中获取安装包和运行进程的信息,作用于系统范围。

·getPackageName:获取包名,包名(packageName)可作为Android应用的唯一标识。

·getResources:获取应用的资源对象Resources,该对象提供一系列的get方法来获取图形Drawable、字符串String以及视频Movie等资源。

·getSharedPreferences:获取用于持久化存储的SharedPreferences对象,相关内容请参考2.6.1节。

·getSystemService:获取系统级别服务的对象,Android应用框架为我们提供了丰富的系统服务,getSystemService方法就是用于获取这些系统服务对象并运用到应用开发中去。表2-4中列出了常用系统服务及其简单介绍,大家可以先了解一下。

表2-4 Android常用系统服务

界面上下文是Android应用开发中最经常被使用的上下文对象,应用界面中几乎所有的UI控件都需要用到,这一点在实际运用的过程中大家会体会得更深刻。

2.5.2 应用上下文(Application Context)

应用上下文(Application Context)在整个应用(Application)开始的时候被创建,用于保存对整个应用资源的引用,在程序中可以通过界面上下文的getApplicationContext方法或者getApplication方法来获取。在实际应用的时候,我们通常会把应用上下文当做全局对象的引用来使用。当然,对于不同的应用我们会定义应用对象来使用,如代码清单2-11所示。

代码清单 2-11

class TestApp extends Application {
...
  private String status;

  public String getStatus(){
        return status;
  }

  public void setStatus(String s){
        status = s;
  }
...
}

TestApp应用类继承自Application基类,定义了自己的状态变量和get/set方法,可在整个应用程序中进行设置和获取。当然,我们还需要在应用程序的配置文件AndroidManifest.xml中进行配置,如代码清单2-12所示。

代码清单 2-12

<application android:name=".TestApp"
   android:icon="@drawable/icon" 
   android:label="@string/app_name">
...
</application>

配置完毕之后,在应用程序的Activity界面中就可以使用getApplicationContext来获取该应用的上下文对象来完成所需功能了,使用范例请参考代码清单2-13。

代码清单 2-13

class TestActivity extends Activity {
...
  @Override
  public void onCreate(Bundle b){
        ...
        TestApp app = (TestApp) this.getApplicationContext();
        String status = app.getStatus();
        ...
  }
... 
}

实际上,在Android应用框架中,android.app.Activity类和android.app.Application类都是从android.content.Context类继承而来的,这也是为什么可以在Activity和Application中方便地使用this来代替对应上下文的原因。当然,理解两种Android上下文的用法在Android应用编程中是非常重要的,因为只有理解了Android上下文才能比较完整地理解Android应用的运行环境,进而更好地控制应用的运行状态。另外,我们也会在第7章中通过实例来加深大家对Android上下文用法的理解。