android四大基礎組件--ServiceService
生命週期詳解
1、Service的生命週期:
I> 在非綁定Service情況下,只有oncreate(),onStartCommand(),onDestory()方法情況下:
操作方法對應生命週期一:
a、【執行startService(Intent)】
執行生命週期方法:oncreate()--->onStartCommand();
b、【執行stopService(Intent)】
執行生命週期方法:onDestory();
操作方法對應生命週期二:
a、【執行startService(Intnet)】
執行生命週期方法:oncreate()--->onStartCommand();
b、【執行返回鍵】--->【執行startService(Intnet)】
執行生命週期方法:onStartCommand();
c、【執行stopService(Intent)】
執行生命週期方法:onDestory();
d、【執行startService(Intnet)】
執行生命週期方法:oncreate()--->onStartCommand();
e、【執行stopService(Intent)】--->【執行返回鍵】--->【執行startService(Intnet)】 執行生命週期方法:oncreate()--->onStartCommand()
總結:
只有當service被首次創建的時候纔會執行oncreate()方法,同個service被多次啓動的時候就不會調用oncreate()方法,但是每次的啓動都會調用onstartCommand()方法;
II> 在綁定Service情況下,只有onCreate(),onBind(Intent intent),onUnbind(Intent intent),onDestroy()方法情況下:
操作方法對應生命週期:
a、【執行bindService(intent,conn, Service.BIND_AUTO_CREATE)】
執行生命週期方法:oncreate()--->onBind()---> ServiceConnection類的onServiceConnected()(作用:activity與service建立連接的方法);
b、【執行unbindService(conn)】
執行生命週期方法:onUnbind()--->onDestory();
III>綁定service和非綁定service混合使用執行的生命週期
操作方法:
a、【執行startService】
執行生命週期方法:onCreate()-->onStartCommand();
b、【執行bindService】
執行生命週期方法:onBind()--->onServiceConnected();
c、【執行onUnbindService】
執行生命週期方法:onUnbind();
d、【執行bindService】
執行生命週期方法:onServiceConnected()-->onRebind();
e、【執行onUnbindService】
執行生命週期方法:onUnbind;
f、【執行stopService】
執行生命週期方法:onDestory()
調用Service如下:
執行的打印結果如下:
總結:
1、當service執行startService操作以後,執行bindService,在service被綁定以後沒有解綁的情況下,去執行stopService,此時不會觸發Service的onDestory方法,但是解除綁定以後,繼續執行stopService將觸發onDestory方法。
2、ServiceConnection類中,如果service意外的發生中斷,則此類中的onServiceDisconnected方法將會被調用執行;正常的中斷(如:執行unbindService方法),則此類中的onServiceDisconnected方法不會被調用。
3、如果一個Service使用兩種模式開啓(bindService和startService),則必須保證兩個生命週期都結束,才能執行onDestory方法。例如:bindxx--》startxx--》stopxx 或者 startxx--》bindxx--》stopxx,以上兩種情況均不會執行onDestory()方法。
4、service與activity使用bindService進行綁定,並不能將service 的生命週期與activity的生命週期綁定。在部分情況下,取消綁定的時候也僅僅是取消service與activity之間的關係,並不能停止該service。
5、service中並不能夠執行耗時操作,因爲service與所在的應用位於同一個進程,並且service也並不是一條新的線程,如果執行耗時操作,將會出現ANR(Application Not Responding)異常。
2、IntentService執行原理
a>使用隊列來管理Intent請求,每當客戶端代碼通過Intent請求啓動IntentService時,IntentService將會把Intent加入隊列,然後開啓一條新的線程來處理該Intent;
b>對於異步 的startService()請求,IntentService會按次序一次處理隊列中的Intent,該線程保證同一時刻只處理一個Intent;
c>IntentService會創建單獨的線程來處理onHandleIntent()方法實現的代碼,因此開發者無需處理多線程的問題;
d>當消息請求處理完以後IntentService會自動停止,開發者無需調用stopSelf()方法停止service;
e>爲Service的onBind()方法提供了默認的實現,默認實現的onBind()返回null;
f>爲Service的onstartCommand()方法也提供了默認的實現,該實現會將請求Intent添加到隊列中。
3、Service和IntentServiceActivity的最主要區別
IntentService裏面能夠執行耗時操作,而不會造成UI線程阻塞。
總結:
上述文章通過在android studio中的運行,完整的展現了Service常用生命週期方法的執行過程,通過了解以上的過程能夠方便我們程序的開發,在適當的生命週期,執行對應的方法,這樣有助於程序的優化、方便後期的維護和減少內存不必要的浪費,更有助於我們對android底層學習。同時也對Service和IntentService進行了比較,以及IntentService的執行原理。不足之處,請大家不惜賜教。