Service生命周期

1、通過StartService啟動(dòng)Service
通過startService啟動(dòng)后,service會(huì)一直無限期運(yùn)行下去,只有外部調(diào)用了stopService()或stopSelf()方法時(shí),該Service才會(huì)停止運(yùn)行并銷毀。
要?jiǎng)?chuàng)建一個(gè)這樣的Service,你需要讓該類繼承Service類,然后重寫以下方法:
- onCreate()
1.如果service沒被創(chuàng)建過,調(diào)用startService()后會(huì)執(zhí)行onCreate()回調(diào);
2.如果service已處于運(yùn)行中,調(diào)用startService()不會(huì)執(zhí)行onCreate()方法。
也就是說,onCreate()只會(huì)在第一次創(chuàng)建service時(shí)候調(diào)用,多次執(zhí)行startService()不會(huì)重復(fù)調(diào)用onCreate(),此方法適合完成一些初始化工作。 - onStartCommand()
如果多次執(zhí)行了Context的startService()方法,那么Service的onStartCommand()方法也會(huì)相應(yīng)的多次調(diào)用。onStartCommand()方法很重要,我們在該方法中根據(jù)傳入的Intent參數(shù)進(jìn)行實(shí)際的操作,比如會(huì)在此處創(chuàng)建一個(gè)線程用于下載數(shù)據(jù)或播放音樂等。 - onBind()
Service中的onBind()方法是抽象方法,Service類本身就是抽象類,所以onBind()方法是必須重寫的,即使我們用不到。 - onDestory()
在銷毀的時(shí)候會(huì)執(zhí)行Service該方法。
2、通過bindService啟動(dòng)Service
bindService啟動(dòng)服務(wù)特點(diǎn):
1.bindService啟動(dòng)的服務(wù)和調(diào)用者之間是典型的client-server模式。調(diào)用者是client,service則是server端。service只有一個(gè),但綁定到service上面的client可以有一個(gè)或很多個(gè)。這里所提到的client指的是組件,比如某個(gè)Activity。
2.client可以通過IBinder接口獲取Service實(shí)例,從而實(shí)現(xiàn)在client端直接調(diào)用Service中的方法以實(shí)現(xiàn)靈活交互,這在通過startService方法啟動(dòng)中是無法實(shí)現(xiàn)的。
3.bindService啟動(dòng)服務(wù)的生命周期與其綁定的client息息相關(guān)。當(dāng)client銷毀時(shí),client會(huì)自動(dòng)與Service解除綁定。當(dāng)然,client也可以明確調(diào)用Context的unbindService()方法與Service解除綁定。當(dāng)沒有任何client與Service綁定時(shí),Service會(huì)自行銷毀。
摘自 http://www.itdecent.cn/p/4c798c91a613
3、IntentService和Service區(qū)別
Service
是長期運(yùn)行在后臺(tái)的應(yīng)用程序組件。
Service 不是一個(gè)單獨(dú)的進(jìn)程,它和應(yīng)用程序在同一個(gè)進(jìn)程中,Service 也不是一個(gè)線程,它和線程沒有任何關(guān)系,所以它不能直接處理耗時(shí)操作。如果直接把耗時(shí)操作放在 Service 的 onStartCommand() 中,很容易引起 ANR .如果有耗時(shí)操作就必須開啟一個(gè)單獨(dú)的線程來處理IntentService
IntentService 是繼承于 Service 并處理異步請求的一個(gè)類,在 IntentService 內(nèi)有一個(gè)工作線程來處理耗時(shí)操作,啟動(dòng) IntentService 的方式和啟動(dòng)傳統(tǒng) Service 一樣,同時(shí),當(dāng)任務(wù)執(zhí)行完后,IntentService 會(huì)自動(dòng)停止,而不需要我們?nèi)ナ謩?dòng)控制。另外,可以啟動(dòng) IntentService 多次,而每一個(gè)耗時(shí)操作會(huì)以工作隊(duì)列的方式在IntentService 的 onHandleIntent 回調(diào)方法中執(zhí)行,并且,每次只會(huì)執(zhí)行一個(gè)工作線程,執(zhí)行完第一個(gè)再執(zhí)行第二個(gè),以此類推。而且,所有請求都在一個(gè)單線程中,不會(huì)阻塞應(yīng)用程序的主線程(UI Thread),同一時(shí)間只處理一個(gè)請求。