對 “ Context ” 理解的深入淺出
前言:Context?有什麼可看的,不就傳個 this 完事兒嘛;誒,還真沒那麼簡單,
從Android系統的角度來理解:Context是一個場景,描述的是一個應用程序環境的信息,代表與操作系統的交互的一種過程。
1. 理解
- Context是提供了關於應用環境全局信息的 抽象類;
- 通過它的對象,纔可以獲取操作系統或應用的相關資源;
2. 使用“ Context ”的兩個場景
1. 調用 Context 下的相關方法
startActivity();
startService();
sendBroadcast();
getAssets();
getSystemService();
getContentResolver();
getPackageManager();
openFileInput()/openFileOutput();
getFilesDir()/getExternalFilesDir();
registerReceiver();
2. 將context作爲實參傳入
Toast.();
view.inflate();
new TextView();
new alertDialong.builder();
3. context最主要的功能是加載和訪問資源
-
啓動或停止Activity/Service;
context.startAtivity(); context.startService()
-
發送廣播/註冊廣播接收器;
registerReceiver(); sendBroadcast();
-
加載佈局/創建視圖對象;
new EditText(context); View.inflate(context, layoutid, null); Toast.makeText(context,text,duration);
-
獲取應用環境全局信息;
|---Context getApplicationContext(); |---Application activity.getApplication() getApplicationInfo(); getContentResolver(); getPackageManager(); getPackageName(); getResources(); getAssets(); getSharedPreferences(); String getString(int id); getSystemService();
注;對於第一、二行解釋:
1.Application對象的創建要早於所有的Activity對象的創建 2.Context :getApplicationContext() 和 Activity:getApplication():返回的都是pplication對象 3.Application的實例,隨着應用加載到內存中,此對象創建,方法調用。只要當前的進程存在,此對象就存在。(單例)如果進程銷燬,此對象銷燬。。 4.Application實例的生命週期要早於所有的其他組件。銷燬不早於其他組件。 5.application可以看成:應用全局數據內存級共享容器。(-->生命週期長,並且各個組件都可以調用,故可以進行事件傳遞)
4. 子類
-
Activity;
-
Service;
-
Application;每個應用只有一個此對象, 單例;
生命週期: 創建---應用啓動且其對象不存在(創建應用的進程之後,早於Activity的創建) 死亡---應用退出不會銷燬Application對象 |--應用的進程被主動或被動殺死時
-
其它實現;
5. 區別
- 不同的功能作用
- 生命週期不一樣:總體說:Activity生命週期最短,service次之,Application最長。
6. 選擇 Activity 還是 getApplicationContext()?
-
new AlertDialog.Builder(activity):只能使用 activity;
-
View.inflate(activity,…):二者都可,但建議使用 activity
-
在地圖的集成中:只能使用 ApplicationContext;
-
Toast.makeText(application/activity):都可以使用
-
new TextView(activity);二者都可,但建議使用 activity.
-
其他情況下,如果使用 activity 會造成內存泄漏的話,建議替換爲 application。
內存泄露: 內存中申請了一個區域,存放一個對象,但是這個對象不可能再被使用了。 但是由於一些錯誤的操作,導致它被引用,且這個引用變量一直都在。 這樣就沒辦法回收這個對象,不能釋放空間。 但是我又看不到這個變量了,不能再去操作了。 這塊內存就白白佔用,但是我又操作不了。這就是泄露。 說明: 1.一般泄露問題是很難看出來的。很多時候,不會像異常一樣拋出來。 2.如果泄露的內存越來越多,導致內存空間越來越少,最終會導致內存溢出。
聲明:本博客根據尚硅谷項目實戰: 硅谷金融.學習整理;
加油!奧裏給!