1. Service 的 start 和 bind 狀態(tài)有什么區(qū)別?
-
startService
Service 生命周期會(huì)經(jīng)歷onCreate--onStartCommand,調(diào)用stopService會(huì)調(diào)用onDestroy方法典徊。如果沒有調(diào)用stopService方法申窘,Service會(huì)一直在后臺(tái)存活,此時(shí)調(diào)用startService理郑,會(huì)調(diào)用onStartCommand方法柿赊。 -
bindService
在bind的時(shí)候圆裕,會(huì)調(diào)用onCreate---onBind岁歉。這個(gè)時(shí)候調(diào)用者和Service綁定在一起术羔。調(diào)用者調(diào)用unbindService方法或者調(diào)用者Context不存在了(如Activity被finish了)杨箭,Service就會(huì)調(diào)用onUnbind->onDestroy寞焙。可以理解為兩者共存亡互婿。
2.同一個(gè) Service捣郊,先 startService,然后再 bindService慈参,如何把它停止掉?
其實(shí)這種情況下呛牲,單使用unbindService或者stopService是不管用的。
因?yàn)樵赽indService不調(diào)用unbindService或者調(diào)用者銷毀驮配,Service不會(huì)銷毀娘扩,同樣只調(diào)用stopService着茸,這時(shí)候還存在綁定關(guān)系,那么Service也不會(huì)銷毀琐旁。最好的辦法是unbindService 然后stopService涮阔。
3.Service 的 onStartCommand 方法的返回值?不同返回值有什么區(qū)別?
conStartCommand方法主要用途在于決定當(dāng)服務(wù)被殺死之后,要如何處理的問題灰殴。
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
在2.0 API level之后敬特,實(shí)現(xiàn)onStart等同于重寫onStartCommand并返回START_STICKY
onStartCommand使用時(shí),返回的是一個(gè)(int)整形牺陶。 這里有四個(gè)返回值:START_STICKY伟阔、START_NO_STUCKY、START_REDELIVER_INTENT义图、START_STICKY_COMPATIBILITY
- START_STICKY:
如果service進(jìn)程被kill掉减俏,保留service的狀態(tài)為開始狀態(tài),但不保留遞送的intent對(duì)象碱工。隨后系統(tǒng)會(huì)嘗試重新創(chuàng)建service娃承,由于服務(wù)狀態(tài)為開始狀態(tài),所以創(chuàng)建服務(wù)后一定會(huì)調(diào)用onStartCommand(Intent,int,int)方法怕篷。如果在此期間沒有任何啟動(dòng)命令被傳遞到service历筝,那么參數(shù)Intent將為null。 - START_NOT_STICKY
“非粘性的”廊谓。使用這個(gè)返回值時(shí)梳猪,如果在執(zhí)行完onStartCommand后,服務(wù)被異常kill掉蒸痹,系統(tǒng)不會(huì)自動(dòng)重啟該服務(wù) - START_REDELIVER_INTENT
重傳Intent春弥。使用這個(gè)返回值時(shí),如果在執(zhí)行完onStartCommand后叠荠,服務(wù)被異常kill掉匿沛,系統(tǒng)會(huì)自動(dòng)重啟該服務(wù),并將Intent的值傳入榛鼎。 - START_STICKY_COMPATIBILITY
START_STICKY的兼容版本逃呼,但不保證服務(wù)被kill后一定能重啟。
flags含義
flags表示啟動(dòng)服務(wù)方式 - START_FLAG_REDELIVERY
如果你實(shí)現(xiàn)onStartCommand()來(lái)安排異步工作或者在另一個(gè)線程中工作, 那么你可能需要使用START_FLAG_REDELIVERY來(lái)讓系統(tǒng)重新發(fā)送一個(gè)intent者娱。這樣如果你的服務(wù)在處理它的時(shí)候被Kill掉, Intent不會(huì)丟失. - START_FLAG_RETRY
表示服務(wù)之前被設(shè)為START_STICKY抡笼,則會(huì)被傳入這個(gè)標(biāo)記。
4.Service 的生命周期方法 onCreate黄鳍、onStart推姻、onBind 等運(yùn)行在哪個(gè)線程?
都是在主線程。
public void onCreate() {
super.onCreate();
if (Looper.myLooper() == Looper.getMainLooper()) {
Log.e(TAG, "onCreate: UIMain ");
}
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
if (Looper.myLooper() == Looper.getMainLooper()) {
Log.e(TAG, "onStart: UIMain");
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
if (Looper.myLooper() == Looper.getMainLooper()) {
Log.e(TAG, "onBind: UIMain");
}
return null;
}