天天看點

Android -- Context

Context基本概念                                                                         

Context是什麼?                                                                                             

1) Context是一個抽象類,其通用實作在ContextImpl類中。

2) Context:是一個通路application環境全局資訊的接口,通過它可以通路application的資源和相關的類,其主要功能如下:

啟動Activity

啟動和停止Service

發送廣播消息(Intent)

注冊廣播消息(Intent)接收者

可以通路APK中各種資源(如Resources和AssetManager等)

可以通路Package的相關資訊

APK的各種權限管理

從以上分析可以看出,Context就是一個對APK包無所不知的大管家,大家需要什麼,直接問它就可以了。

Context與View的關系                                                                                   

View與Context(或Activity)的關系類似于明星與經紀人的關系,是以建立View時,必須明确指定其Context(即經紀人或大管家),否則View就成不了明星。

Context家族關系                                                                                           

Android -- Context

Context關鍵函數                                                                                           

Android -- Context
Android -- Context

ContextImpl關鍵成員和函數                                                                          

Android -- Context
Android -- Context

ContextWrapper                                                                                        

它隻是對Context類的一種封裝,它的構造函數包含了一個真正的Context引用,即ContextImpl對象。

Android -- Context
Android -- Context

ContextThemeWrapper                                                                            

該類内部包含了主題(Theme)相關的接口,即android:theme屬性指定的。隻有Activity需要主題,Service不需要主題,是以Service直接繼承于ContextWrapper類。

Android -- Context
Android -- Context

何時建立Context                                                                         

應用程式在以下幾種情況下建立Context執行個體:

1) 建立Application 對象時, 而且整個App共一個Application對象

2) 建立Service對象時

3) 建立Activity對象時

是以應用程式App共有的Context數目公式為:

總Context執行個體個數 = Service個數 + Activity個數 + 1(Application對應的Context執行個體)

ActivityThread消息處理函數與本節相關的内容如下:

Android -- Context
Android -- Context

建立Application對象時建立Context執行個體                                                        

每個應用程式在第一次啟動時,都會首先建立一個Application對象。從startActivity流程可知,建立Application的時機在handleBindApplication()方法中,該函數位于 ActivityThread.java類中 ,相關代碼如下:

Android -- Context
Android -- Context

建立Activity對象時建立Context執行個體                                                               

通過startActivity()或startActivityForResult()請求啟動一個Activity時,如果系統檢測需要建立一個Activity對象時,就會回調handleLaunchActivity()方法,該方法繼而調用performLaunchActivity()方法,去建立一個Activity執行個體,并且回調onCreate(),onStart()方法等,函數都位于 ActivityThread.java類 ,相關代碼如下:

Android -- Context
Android -- Context
Android -- Context
Android -- Context

建立Service對象時建立Context執行個體                                                               

通過startService或者bindService時,如果系統檢測到需要新建立一個Service執行個體,就會回調handleCreateService()方法,完成相關資料操作。handleCreateService()函數位于 ActivityThread.java類,如下:

Android -- Context
Android -- Context

小結                                                                                            

通過對ContextImp的分析可知,其方法的大多數操作都是直接調用其屬性mPackageInfo(該屬性類型為PackageInfo)的相關方法而來。這說明ContextImp是一種輕量級類,而PackageInfo才是真正重量級的類。而一個App裡的所有ContextImpl執行個體,都對應同一個packageInfo對象。

我是天王蓋地虎的分割線                                                                 

本文轉自我愛物聯網部落格園部落格,原文連結:http://www.cnblogs.com/yydcdut/p/3886648.html,如需轉載請自行聯系原作者

繼續閱讀