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家族關系
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauUTN2gTMygzMwYTMxEjMw8CX4ADNxAjMvw1M3czN4UzLcd2bsJ2Lc12bj5ycn9Gbi52YuAzcldWYtl2Lc9CX6MHc0RHaiojIsJye.jpg)
Context關鍵函數
ContextImpl關鍵成員和函數
ContextWrapper
它隻是對Context類的一種封裝,它的構造函數包含了一個真正的Context引用,即ContextImpl對象。
ContextThemeWrapper
該類内部包含了主題(Theme)相關的接口,即android:theme屬性指定的。隻有Activity需要主題,Service不需要主題,是以Service直接繼承于ContextWrapper類。
何時建立Context
應用程式在以下幾種情況下建立Context執行個體:
1) 建立Application 對象時, 而且整個App共一個Application對象
2) 建立Service對象時
3) 建立Activity對象時
是以應用程式App共有的Context數目公式為:
總Context執行個體個數 = Service個數 + Activity個數 + 1(Application對應的Context執行個體)
ActivityThread消息處理函數與本節相關的内容如下:
建立Application對象時建立Context執行個體
每個應用程式在第一次啟動時,都會首先建立一個Application對象。從startActivity流程可知,建立Application的時機在handleBindApplication()方法中,該函數位于 ActivityThread.java類中 ,相關代碼如下:
建立Activity對象時建立Context執行個體
通過startActivity()或startActivityForResult()請求啟動一個Activity時,如果系統檢測需要建立一個Activity對象時,就會回調handleLaunchActivity()方法,該方法繼而調用performLaunchActivity()方法,去建立一個Activity執行個體,并且回調onCreate(),onStart()方法等,函數都位于 ActivityThread.java類 ,相關代碼如下:
建立Service對象時建立Context執行個體
通過startService或者bindService時,如果系統檢測到需要新建立一個Service執行個體,就會回調handleCreateService()方法,完成相關資料操作。handleCreateService()函數位于 ActivityThread.java類,如下:
小結
通過對ContextImp的分析可知,其方法的大多數操作都是直接調用其屬性mPackageInfo(該屬性類型為PackageInfo)的相關方法而來。這說明ContextImp是一種輕量級類,而PackageInfo才是真正重量級的類。而一個App裡的所有ContextImpl執行個體,都對應同一個packageInfo對象。
我是天王蓋地虎的分割線
本文轉自我愛物聯網部落格園部落格,原文連結:http://www.cnblogs.com/yydcdut/p/3886648.html,如需轉載請自行聯系原作者