標籤:des android style blog http ar io color os
一,進程模型及進程託管
1,一個APP應用是由一個或多個組件構成的,這些組件可以運行在一個進程中,也可以分別運行在多個進程中;進程的構造和銷毀是由系統全權負責的。2,一個應用進程只有一個應用環境對象,它在第一個應用進程的組件載入之前被構造,在應用進程中最後一個組件結束後銷毀。3,組件可以通過 android:process = ":com.zy.tool.another" 將組件配置到指定的進程中,冒號開頭表示這是一個私人進程,只有本應用的組件才能使用該進程。如果是小寫字母開頭表示是一個共用進程,那麼其它應用的組件也可以使用該進程。所以說一個應用可以有一個或多個進程,即:可以有一個預設進程和多個附加進程。4,進程按優先順序從高到低分為: 1)前台進程:有正在與使用者互動的介面組件 或者 有服務元件和使用者互動的介面組件綁定 或者 有服務元件的onCreate, onStart, onDestroy方法正在執行 或者 有前台服務元件或者 觸發器組件的onReceive方法正在執行。2)可視進程:沒有與使用者互動的介面組件,但是介面組件可見,或者 有服務與使用者可視的介面組件綁定。3)服務進程: 有服務在後台運行。4)後台進程:沒有與使用者互動的介面組件,並且也沒有可見的介面組件,即整個app處於後台,並且沒有正在啟動並執行服務。5)空進程:該進程中沒有任何組件在運行。進程優先順序是在不斷變化的,它隨著進程中組件與使用者互動狀態的改變而改變。 進程回收策略:1)按優先順序從低到高回收。2)越近使用過的進程越晚回收。 可能導致進程被回收的行為:1)介面組件被銷毀。2)觸發器執行完畢或者被登出。3)系統進入了待機狀態。 5 異常進程和無響應進程:1) 異常進程:系統會先儲存進程中各個任務的介面組件棧中的內容,然後強行終止進程。然後重新構造新的應用進程,並將各個任務的組件棧恢複到異常前的狀態。2)無響應進程:應用對使用者的操作超過5秒仍未處理 或者 觸發器的onReceive執行時間超過10秒。 此時會彈出對話方塊提示使用者是終止進程還是繼續等待。
二,組件的生命週期:
1,介面組件的生命週期:1)構造組件時先調用 onCreate方法,onStart()執行後進入可視狀態。2)如果是恢複性構造(即介面組件是由系統回收的而非使用者關閉的),那麼onRestoreInstanceState()會被調用。3)onResume()執行後進入前台狀態,可以與使用者進行互動了。4)如果介面組件被系統回收,則會執行 onSaveInstanceState()方法。5)onPause()執行後介面組件進入可視狀態。注意:如果是系統強制回收,則後面的兩個方法可能來不及執行。6)onStop()執行後介面組件進入後台狀態。7) onDestroy() 執行後介面組件生命週期結束。
2,服務元件生命週期:參考:a 深入淺出 Android核心組件(1):http://mobile.51cto.com/android-315615.htm b Android組件系列,Android Service 深入解析:
http://www.cnblogs.com/smyhvae/p/4070518.html
1 ) Service預設是運行在主線程中的;Android中的後台指的是運行不依賴UI,即使APP關閉,只要進程還在,Service就可以繼續運行。
2)服務一旦啟動後,就一直處於運行狀態,只有調用stopService 或者 stopSelf 方法才會讓服務停止下來。
3)通過調用方式初次開機服務會執行 onCreate方法,然後執行 onStartCommand方法,如果服務沒有停止,再次調用服務會直接執行 onStartCommand方法。
4)服務的onStartCommand方法的傳回值:
a START_STICKY: 服務進程被kill後,後續如果資源運行系統會重新啟動服務,並執行onStartCommand方法,但不會保留之前傳送的Intent對象,除非有組件重新發送。
例如音樂應用,返回這種值的服務要在適當的時候手動調用代碼關閉服務。
b START_REDELIVER_INTENT 系統會自動重啟該服務,並會將Intent傳入。重新發送後,flags參數的值會變成 Service.FLAG_START_REDELIVERY
c START_NOT_STICKY: 服務被終止後就不會再啟動。
5)IntentServer 是一個非同步,會自動關閉的服務,它的 onHandleIntent方法是在單獨的子線程中執行的,該服務每次只會啟動一個線程來執行任務,多個任務會排成工作隊列,順序執行。 onHandleIntent執行完畢後服務會自動停止,即會調用 onDestroy方法。
6)Service必須在沒有和其它組件關聯(調用unbindService方法),並且已經停止(調用stopService)的情況下才會被銷毀(執行onDestroy方法),單獨解除關聯或者停止服務並不會銷毀服務。
7)綁定方式啟動服務:bindService方法是非同步,被調用後會立即返回,並不會返回IBinder對象,要接收IBinder對象,必須要實現一個ServiceConnection執行個體,並將該執行個體傳遞給bindService方法,綁定成功後系統會先調用onBind方法,該方法的傳回值就是一個IBinder對象,然後回調ServiceConnection的onServiceConnected方法,並將IBinder對象通過參數傳遞進來,然後我們就可以在該方法中調用IBinder的方法了。
通過這種方式啟動的服務,我們一般會在服務內部建立一個繼承Binder的內部類,該內部類裡面提供一些公用方法,用來向外公開服務的功能,當其它組件和服務建立關聯後,就會通過得到的IBinder執行個體來調用服務的功能了。
重複調用unbindService會引發異常,所以需要在程式裡面做一些判斷。
8)started服務和bind服務的區別:(摘自:http://www.cnblogs.com/smyhvae/p/4070518.html )
區別一:生命週期
區別二:參數傳遞
實際開發中的技巧;
9)Service生命週期圖 :(摘自:http://www.cnblogs.com/smyhvae/p/4070518.html )
10)使用bindService進行IPC通訊的步驟:
注意:觸發器無法綁定服務。
10.1) 在Android進行處理序間通訊,需要通過 IBinder/Binder 架構來實現,IBinder/Binder 介面就是Android遠程對象的基本介面,描述與遠程對象進行通訊的協議(即如何調用遠程對象,遠程對象都有哪些功能)。
AIDL 可以用於讓某個Service與多個應用的組件進行跨進程通訊,即實現了一個Service被多個應用共用的功能。一般用AIDL來描述需要被用戶端調用的介面,它以.aidl 檔案的形式存在,內部書寫方式和普通java類的書寫方式一樣。注意:aidl檔案只是起一個模板作用,真正起作用的是ADT根據aidl檔案產生的那個.java檔案。
這個java檔案會按照 aidl的描述產生一個繼承自android.os.IInterface的介面A,介面A內部有一個靜態抽象類別 Stub,Stub類會繼承 android.os.Binder類並實現介面A,
Stub類內部還有一個內部靜態類Proxy,Proxy也實現了介面A,Proxy內部有一個IBinder對象,這個Proxy就是實現真正的跨進程調用使用的。
10.2) 建立一個類 AImpl ,這個類實現 A.Stub介面,這個AImpl就是業務對象。
10.3)建立一個Service ,內部聲明一個 AImpl類型的變數 mBinder,並且在 onBind方法中返回該變數。
11)如果將Service的配置改為: android:process=":remote",那麼介面組件和服務元件就會運行在不同的進程中,此時就不能直接綁定服務了,而只能通過IPC調用服務了。
另外如果跨進程調用遠端Service,就需要使用隱式Intent了,無法使用顯式Intent。並且如果A應用要調用B應用中的介面,需要將B應用中aidl檔案原樣拷貝到A應用中,包括包名。
12)通過Messenger來實現IPC通訊,底層依然使用的是AIDL,具體來說就是在調用端建立一個Messenger,並在綁定Service的時候將Messenger和Binder綁定(messenger = new Messenger(binder); ); 在被調用端的Service中,也建立一個Messenger,同時建立一個Handler,並讓它和Messenger綁定(當訊息來時讓Handler來處理),然後在onBind方法中直接 return messenger.getBinder(); 返回Binder,這樣Messenger和Binder就綁定好了; 這樣兩個Messenger綁定到同一個Binder上了,就可以通訊了,這種方式是安全執行緒的和同步方式執行的。
3,觸發器組件生命週期
觸發器組件的生命週期就是onReceive方法,該方法一執行完畢會立即被系統回收。
onReceive方法執行時,觸發器所在進程為前台進程。
onReceive方法在主線程中執行,執行時間長度超過10秒會變為無響應進程,有被強制回收的風險。
4,資料來源組件生命週期
資料來源組件在被構造時,onCreate方法會被調用,而且一旦被構造就會一直存在,直到所在進程被回收。
5,應用環境對象的生命週期
與進程生命週期一樣長,被構造時onCreate方法會被調用,被銷毀時onTerminate方法會被調用(也可能不會調用)。
來自為知筆記(Wiz)
android核心系列--1,組件生命週期