歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android中Context詳解 ---- 你所不知道的Context

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

日期:2017/3/1 10:17:11   编辑:Linux編程

大家好, 今天給大家介紹下我們在應用開發中最熟悉而陌生的朋友-----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. @Override
  9. public Object getSystemService(String name){
  10. ...
  11. else if (ACTIVITY_SERVICE.equals(name)) {
  12. return getActivityManager();
  13. }
  14. else if (INPUT_METHOD_SERVICE.equals(name)) {
  15. return InputMethodManager.getInstance(this);
  16. }
  17. }
  18. @Override
  19. public void startActivity(Intent intent) {
  20. ...
  21. //開始啟動一個Activity
  22. mMainThread.getInstrumentation().execStartActivity(
  23. getOuterContext(), mMainThread.getApplicationThread(), null, null, intent, -1);
  24. }
  25. }
Copyright © Linux教程網 All Rights Reserved