1.Service的start和bind狀態(tài)有什么區(qū)別?
調(diào)用startService,service的完整生命周期從 onCreate=>onStartCommand=>onDestroy。多次調(diào)用startService只會(huì)多次調(diào)用onStartCommand,并不會(huì)調(diào)用onCreate。start啟動(dòng)的service與該組件沒(méi)有任何聯(lián)系,即使該組件被銷(xiāo)毀了,service仍然在后臺(tái)運(yùn)行,必須調(diào)用stopService或者stopSelf來(lái)銷(xiāo)毀service。
調(diào)用bindService,service的完整生命周期從onCreate=>onBind=>onUnBind=>onDestroy。如果service在bind方法調(diào)用前已經(jīng)啟動(dòng),那么綁定服務(wù)后只調(diào)用onBind。多次調(diào)用bindService并不會(huì)調(diào)用onCreate和onBind,它們都在服務(wù)被創(chuàng)建時(shí)調(diào)用。bind啟動(dòng)的服務(wù)依賴(lài)這些組件,當(dāng)這些組件被銷(xiāo)毀時(shí),該服務(wù)同樣也會(huì)被銷(xiāo)毀,并且必須調(diào)用unbindService來(lái)銷(xiāo)毀。
2. 同一個(gè)Service,先startService,然后再bindService,如何把它停止掉?
- 調(diào)用n次startService,只需調(diào)用一次stopService或者stopSelf。
調(diào)用n次bindService,必須調(diào)用n次unbindService。
所有只需調(diào)用一次stopService或者stopSelf和n次unbindService,沒(méi)有執(zhí)行順序。
3. 你有注意到Service的onStartCommand方法的返回值嗎?不同返回值有什么區(qū)別?
?3.1 START_STICKY:
系統(tǒng)在調(diào)用完onStartCommand()方法后,如果當(dāng)前服務(wù)被終止了,系統(tǒng)會(huì)使該服務(wù)保持在啟動(dòng)狀態(tài),不過(guò)它不會(huì)保留之前傳遞的Intent對(duì)象。但是由于它保持啟動(dòng)狀態(tài),隨后系統(tǒng)會(huì)嘗試重新創(chuàng)建service,但之前的Intent對(duì)象沒(méi)有被保存。在這個(gè)情況下,如果期間沒(méi)有任何啟動(dòng)命令被傳遞到Service,那么參數(shù)Intent將為null。因此使用START_STICKY作為返回值,適用于不執(zhí)行命令的媒體播放器(或類(lèi)似的服務(wù)),它只是無(wú)限期的運(yùn)行著并等待工作的到來(lái).
?
?3.2 START_NOT_STICKY:
系統(tǒng)在調(diào)用完onStartCommand方法后,如果當(dāng)前服務(wù)被終止了并且在此期間沒(méi)有任何啟動(dòng)命令被傳遞到Service,那么系統(tǒng)將是使當(dāng)前服務(wù)退出啟動(dòng)狀態(tài),并且除非重新調(diào)用Context.startService(Intent),否則不會(huì)重新被創(chuàng)建(即不會(huì)重新調(diào)用onCreate方法)。因?yàn)楫?dāng)前服務(wù)退出了啟動(dòng)狀態(tài),所以除非在此期間啟動(dòng)命令被傳遞到Service,否則也不會(huì)調(diào)用。這是最安全的選項(xiàng),用來(lái)避免在不需要的時(shí)候運(yùn)行你的服務(wù)。onStartCommand方法。
?
?3.3 START_REDELIVER_INTENT:
重傳Intent。使用這個(gè)返回值時(shí),如果在執(zhí)行完onStartCommand后,服務(wù)被異常kill掉,系統(tǒng)會(huì)自動(dòng)重啟該服務(wù),并將Intent的值傳入。
?
?3.4 START_STICKY_COMPATIBILITY:
START_STICKY的兼容版本,但不保證服務(wù)被kill后一定能重啟。
4. Service的生命周期方法onCreate、onStart、onBind等運(yùn)行在哪個(gè)線(xiàn)程?
- Service的所有方法都是默認(rèn)運(yùn)行在主線(xiàn)程。