“ Context ” 還有什麼值得研究?

前言:Context?有什麼可看的,不就傳個 this 完事兒嘛;誒,還真沒那麼簡單,
從Android系統的角度來理解:Context是一個場景,描述的是一個應用程序環境的信息,代表與操作系統的交互的一種過程。

1. 理解

  1. Context是提供了關於應用環境全局信息的 抽象類
  2. 通過它的對象,纔可以獲取操作系統或應用的相關資源;

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最主要的功能是加載和訪問資源

  1. 啓動或停止Activity/Service;

    context.startAtivity();
    context.startService()
    
  2. 發送廣播/註冊廣播接收器;

    registerReceiver();
    sendBroadcast();
    
  3. 加載佈局/創建視圖對象;

    new EditText(context);
    View.inflate(context, layoutid, null);
    Toast.makeText(context,text,duration);
    
  4. 獲取應用環境全局信息;

    |---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. 子類

  1. Activity;

  2. Service;

  3. Application;每個應用只有一個此對象, 單例;

    生命週期:
    	創建---應用啓動且其對象不存在(創建應用的進程之後,早於Activity的創建)
    	死亡---應用退出不會銷燬Application對象
    	   |--應用的進程被主動或被動殺死時
    
  4. 其它實現;

5. 區別

  1. 不同的功能作用
  2. 生命週期不一樣:總體說:Activity生命週期最短,service次之,Application最長。

6. 選擇 Activity 還是 getApplicationContext()?

  1. new AlertDialog.Builder(activity):只能使用 activity

  2. View.inflate(activity,…):二者都可,但建議使用 activity

  3. 在地圖的集成中:只能使用 ApplicationContext;

  4. Toast.makeText(application/activity):都可以使用

  5. new TextView(activity);二者都可,但建議使用 activity.

  6. 其他情況下,如果使用 activity 會造成內存泄漏的話,建議替換爲 application。

    內存泄露:
    內存中申請了一個區域,存放一個對象,但是這個對象不可能再被使用了。
    但是由於一些錯誤的操作,導致它被引用,且這個引用變量一直都在。
    這樣就沒辦法回收這個對象,不能釋放空間。
    但是我又看不到這個變量了,不能再去操作了。
    這塊內存就白白佔用,但是我又操作不了。這就是泄露。
     
    說明:
    1.一般泄露問題是很難看出來的。很多時候,不會像異常一樣拋出來。
    2.如果泄露的內存越來越多,導致內存空間越來越少,最終會導致內存溢出。
    

聲明:本博客根據尚硅谷項目實戰: 硅谷金融.學習整理;

在這裏插入圖片描述
加油!奧裏給!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章