Android之Context理解

Application的Context是一個全局靜態變量,SDK的說明是隻有當你引用這個context的生命週期超過了當前activity的生命週期,而和整個應用的生命週期掛鉤時,纔去使用這個application的context。

一種推薦的用法就是應用程序註冊廣播broadcast時,使用這個context。

引用application context並不會導致內存泄漏。引用activity的context纔會導致內存泄漏,當你的引用對象的生命週期超過了當前activity的生命週期時,系統回收你的activity時發現還有一個context的強引用,而不去銷燬這個activity,導致內存泄漏,在開發過程中,需要非常重視這點(一個全局靜態變量在引用context時一定要使用application的Context, 而不要使用activity的)

什麼是Content

1、它描述的是一個應用程序環境的信息,即上下文。

2、該類是一個抽象(abstract class)類,Android提供了該抽象類的具體實現類(後面我們會講到是ContextIml類)。

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

信息 等。。

 

應用程序創建Context實例的情況有如下幾種情況:

1、創建Application 對象時, 而且整個App共一個Application對象

2、創建Service對象時

3、創建Activity對象時

因此應用程序App共有的Context數目公式爲:

 

總Context實例個數 = Service個數 + Activity個數 + 1(Application對應的Context實例)


 

 

具體創建Context的時機

 

1、創建Application對象的時機

 

每個應用程序在第一次啓動時,都會首先創建Application對象。如果對應用程序啓動一個Activity(startActivity)流程比較

清楚的話,創建Application的時機在創建handleBindApplication()方法中

2、創建Activity對象的時機

 

通過startActivity()或startActivityForResult()請求啓動一個Activity時,如果系統檢測需要新建一個Activity對象時,就會

回調handleLaunchActivity()方法,該方法繼而調用performLaunchActivity()方法,去創建一個Activity實例,並且回調

onCreate(),onStart()方法等。

3、創建Service對象的時機

 

通過startService或者bindService時,如果系統檢測到需要新創建一個Service實例,就會回調handleCreateService()方法,

完成相關數據操作。

 還有就是,在使用context的時候,小心內存泄露,防止內存泄露,注意一下幾個方面:

1. 不要讓生命週期長的對象引用activity context,即保證引用activity的對象要與activity本身生命週期是一樣的

2. 對於生命週期長的對象,可以使用application context

3. 避免非靜態的內部類,儘量使用靜態類,避免生命週期問題,注意內部類對外部對象引用導致的生命週期變化

現在回到正題,說一下android全局變量,在平時的開發過程中,有時候可能會需要一些全局數據,來讓應用中的所有Activity和View都能訪問到,大家在遇到這種情況時,可能首先會想到自己定義一個類,然後創建很多靜態成員,android已經爲我們提供了這種情況的解決方案:

在Android中,有一個Application類,在Activity中可以使用getApplication()方法獲得實例,使用它就可以獲得當前應用的主題、資源文件中的內容等,這個類更靈活的一個特性就是可以被繼承,來添加自己的全局屬性.


發佈了33 篇原創文章 · 獲贊 4 · 訪問量 7255
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章