大家對上下文(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的用途比ApplicationInfo更加廣泛,該類可以從系統的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){
- sstatus = 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上下文用法的理解。