歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android中Context詳解 ---- 你所不知道的Context

大家好,  今天給大家介紹下我們在應用開發中最熟悉而陌生的朋友-----Context類 ,說它熟悉,是應為我們在開發中

時刻的在與它打交道,例如:Service、BroadcastReceiver、Activity等都會利用到Context的相關方法 ; 說它陌生,完全是

因為我們真正的不懂Context的原理、類結構關系。一個簡單的問題是,一個應用程序App中存在多少個Context實例對象呢?

一個、兩個? 在此先賣個關子吧。讀了本文,相信您會豁然開朗的 。

Context,中文直譯為“上下文”,SDK中對其說明如下:

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、該類是一個抽象(abstract class)類,Android提供了該抽象類的具體實現類(後面我們會講到是ContextIml類)。

3、通過它我們可以獲取應用程序的資源和類,也包括一些應用級別操作,例如:啟動一個Activity,發送廣播,接受Intent

信息 等。。

於是,我們可以利用該Context對象去構建應用級別操作(application-level operations) 。

一、Context相關類的繼承關系

相關類介紹:

Context類    路徑: /frameworks/base/core/java/android/content/Context.java

說明:  抽象類,提供了一組通用的API。

源代碼(部分)如下:  

  1. public abstract class Context {  
  2.      ...  
  3.      public abstract Object getSystemService(String name);  //獲得系統級服務   
  4.      public abstract void startActivity(Intent intent);     //通過一個Intent啟動Activity   
  5.      public abstract ComponentName startService(Intent service);  //啟動Service   
  6.      //根據文件名得到SharedPreferences對象   
  7.      public abstract SharedPreferences getSharedPreferences(String name,int mode);  
  8.      ...  
  9. }  

ContextIml.java類  路徑 :/frameworks/base/core/java/android/app/ContextImpl.java

說明:該Context類的實現類為ContextIml,該類實現了Context類的功能。請注意,該函數的大部分功能都是直接調用

其屬性mPackageInfo去完成,這點我們後面會講到。

源代碼(部分)如下:

  1. /** 
  2.  * Common implementation of Context API, which provides the base 
  3.  * context object for Activity and other application components. 
  4.  */  
  5. class ContextImpl extends Context{  
  6.     //所有Application程序公用一個mPackageInfo對象   
  7.     /*package*/ ActivityThread.PackageInfo mPackageInfo;  
  8.       
  9.     @Override  
  10.     public Object getSystemService(String name){  
  11.         ...  
  12.         else if (ACTIVITY_SERVICE.equals(name)) {  
  13.             return getActivityManager();  
  14.         }   
  15.         else if (INPUT_METHOD_SERVICE.equals(name)) {  
  16.             return InputMethodManager.getInstance(this);  
  17.         }  
  18.     }   
  19.     @Override  
  20.     public void startActivity(Intent intent) {  
  21.         ...  
  22.         //開始啟動一個Activity   
  23.         mMainThread.getInstrumentation().execStartActivity(  
  24.             getOuterContext(), mMainThread.getApplicationThread(), nullnull, intent, -1);  
  25.     }  
  26. }  
Copyright © Linux教程網 All Rights Reserved