原文連接:https://blog.csdn.net/xiangzhihong8/java/article/details/96280254java
一、常規知識點
一、 Android類加載器
在Android開發中,不論是插件化仍是組件化,都是基於Android系統的類加載器ClassLoader來設計的。只不過Android平臺上虛擬機運行的是Dex字節碼,一種對class文件優化的產物,傳統Class文件是一個Java源碼文件會生成一個.class文件,而Android是把全部Class文件進行合併、優化,而後再生成一個最終的class.dex,目的是把不一樣class文件重複的東西只需保留一份,在早期的Android應用開發中,若是不對Android應用進行分dex處理,那麼最後一個應用的apk只會有一個dex文件。數據庫
Android中經常使用的類加載器有兩種,DexClassLoader和PathClassLoader,它們都繼承於BaseDexClassLoader。區別在於調用父類構造器時,DexClassLoader多傳了一個optimizedDirectory參數,這個目錄必須是內部存儲路徑,用來緩存系統建立的Dex文件。而PathClassLoader該參數爲null,只能加載內部存儲目錄的Dex文件。因此咱們能夠用DexClassLoader去加載外部的apk文件,這也是不少插件化技術的基礎。緩存
二、 Service
理解Android的Service,能夠從如下幾個方面來理解:服務器
Service是在main Thread中執行,Service中不能執行耗時操做(網絡請求,拷貝數據庫,大文件)。
能夠在xml中設置Service所在的進程,讓Service在另外的進程中執行。
Service執行的操做最可能是20s,BroadcastReceiver是10s,Activity是5s。
Activity經過bindService(Intent,ServiceConnection,flag)與Service綁定。
Activity能夠經過startService和bindService啓動Service。
IntentService
IntentService是一個抽象類,繼承自Service,內部存在一個ServiceHandler(Handler)和HandlerThread(Thread)。IntentService是處理異步請求的一個類,在IntentService中有一個工做線程(HandlerThread)來處理耗時操做,啓動IntentService的方式和普通的同樣,不過當執行完任務以後,IntentService會自動中止。另外能夠屢次啓動IntentService,每個耗時操做都會以工做隊列的形式在IntentService的onHandleIntent回調中執行,而且每次執行一個工做線程。IntentService的本質是:封裝了一個HandlerThread和Handler的異步框架。網絡
2.一、生命週期示意圖
Service 做爲 Android四大組件之一,應用很是普遍。和Activity同樣,Service 也有一系列的生命週期回調函數,具體以下圖。
一般,啓動Service有兩種方式,startService和bindService方式。框架
2.二、startService生命週期
當咱們經過調用了Context的startService方法後,咱們便啓動了Service,經過startService方法啓動的Service會一直無限期地運行下去,只有在外部調用Context的stopService或Service內部調用Service的stopSelf方法時,該Service纔會中止運行並銷燬。異步
onCreate
onCreate: 執行startService方法時,若是Service沒有運行的時候會建立該Service並執行Service的onCreate回調方法;若是Service已經處於運行中,那麼執行startService方法不會執行Service的onCreate方法。也就是說若是屢次執行了Context的startService方法啓動Service,Service方法的onCreate方法只會在第一次建立Service的時候調用一次,之後均不會再次調用。咱們能夠在onCreate方法中完成一些Service初始化相關的操做。函數
onStartCommand
onStartCommand: 在執行了startService方法以後,有可能會調用Service的onCreate方法,在這以後必定會執行Service的onStartCommand回調方法。也就是說,若是屢次執行了Context的startService方法,那麼Service的onStartCommand方法也會相應的屢次調用。onStartCommand方法很重要,咱們在該方法中根據傳入的Intent參數進行實際的操做,好比會在此處建立一個線程用於下載數據或播放音樂等。組件化
public @StartResult int onStartCommand(Intent intent, @StartArgFlags int flags, int startId) { }
當Android面臨內存匱乏的時候,可能會銷燬掉你當前運行的Service,而後待內存充足的時候能夠從新建立Service,Service被Android系統強制銷燬並再次重建的行爲依賴於Service中onStartCommand方法的返回值。咱們經常使用的返回值有三種值,START_NOT_STICKY、START_STICKY和START_REDELIVER_INTENT,這三個值都是Service中的靜態常量。優化
START_NOT_STICKY
若是返回START_NOT_STICKY,表示當Service運行的進程被Android系統強制殺掉以後,不會從新建立該Service,固然若是在其被殺掉以後一段時間又調用了startService,那麼該Service又將被實例化。那什麼情境下返回該值比較恰當呢?若是咱們某個Service執行的工做被中斷幾回可有可無或者對Android內存緊張的狀況下須要被殺掉且不會當即從新建立這種行爲也可接受,那麼咱們即可將 onStartCommand的返回值設置爲START_NOT_STICKY。舉個例子,某個Service須要定時從服務器獲取最新數據:經過一個定時器每隔指定的N分鐘讓定時器啓動Service去獲取服務端的最新數據。當執行到Service的onStartCommand時,在該方法內再規劃一個N分鐘後的定時器用於再次啓動該Service並開闢一個新的線程去執行網絡操做。假設Service在從服務器獲取最新數據的過程當中被Android系統強制殺掉,Service不會再從新建立,這也不要緊,由於再過N分鐘定時器就會再次啓動該Service並從新獲取數據。
START_STICKY
若是返回START_STICKY,表示Service運行的進程被Android系統強制殺掉以後,Android系統會將該Service依然設置爲started狀態(即運行狀態),可是再也不保存onStartCommand方法傳入的intent對象,而後Android系統會嘗試再次從新建立該Service,並執行onStartCommand回調方法,可是onStartCommand回調方法的Intent參數爲null,也就是onStartCommand方法雖然會執行可是獲取不到intent信息。若是你的Service能夠在任意時刻運行或結束都沒什麼問題,並且不須要intent信息,那麼就能夠在onStartCommand方法中返回START_STICKY,好比一個用來播放背景音樂功能的Service就適合返回該值。
START_REDELIVER_INTENT
若是返回START_REDELIVER_INTENT,表示Service運行的進程被Android系統強制殺掉以後,與返回START_STICKY的狀況相似,Android系統會將再次從新建立該Service,並執行onStartCommand回調方法,可是不一樣的是,Android系統會再次將Service在被殺掉以前最後一次傳入onStartCommand方法中的Intent再次保留下來並再次傳入到從新建立後的Service的onStartCommand方法中,這樣咱們就能讀取到intent參數。只要返回START_REDELIVER_INTENT,那麼onStartCommand重的intent必定不是null。若是咱們的Service須要依賴具體的Intent才能運行(須要從Intent中讀取相關數據信息等),而且在強制銷燬後有必要從新建立運行,那麼這樣的Service就適合返回START_REDELIVER_INTENT。
onBind
Service中的onBind方法是抽象方法,因此Service類自己就是抽象類,也就是onBind方法是必須重寫的,即便咱們用不到。在經過startService使用Service時,咱們在重寫onBind方法時,只須要將其返回null便可。onBind方法主要是用於給bindService方法調用Service時纔會使用到。
onDestroy
onDestroy: 經過startService方法啓動的Service會無限期運行,只有當調用了Context的stopService或在Service內部調用stopSelf方法時,Service纔會中止運行並銷燬,在銷燬的時候會執行Service回調函數。
2.三、bindService生命週期
bindService方式啓動Service主要有如下幾個生命週期函數:
onCreate():
首次建立服務時,系統將調用此方法。若是服務已在運行,則不會調用此方法,該方法只調用一次。
onStartCommand():
當另外一個組件經過調用startService()請求啓動服務時,系統將調用此方法。
onDestroy():
當服務再也不使用且將被銷燬時,系統將調用此方法。
onBind():
當另外一個組件經過調用bindService()與服務綁定時,系統將調用此方法。
onUnbind():
當另外一個組件經過調用unbindService()與服務解綁時,系統將調用此方法。
onRebind():
當舊的組件與服務解綁後,另外一個新的組件與服務綁定,onUnbind()返回true時,系統將調用此方法。
免費獲取Android進階資料點擊下方連接