Service生命周期
1惠奸、通過(guò)StartService啟動(dòng)Service
通過(guò)startService啟動(dòng)后,service會(huì)一直無(wú)限期運(yùn)行下去睛榄,只有外部調(diào)用了stopService()或stopSelf()方法時(shí)馅闽,該Service才會(huì)停止運(yùn)行并銷毀。
要?jiǎng)?chuàng)建一個(gè)這樣的Service耸采,你需要讓該類繼承Service類,然后重寫(xiě)以下方法:
- onCreate()
1.如果service沒(méi)被創(chuàng)建過(guò)工育,調(diào)用startService()后會(huì)執(zhí)行onCreate()回調(diào)虾宇;
2.如果service已處于運(yùn)行中,調(diào)用startService()不會(huì)執(zhí)行onCreate()方法如绸。
也就是說(shuō)嘱朽,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()方法很重要岸军,我們?cè)谠摲椒ㄖ懈鶕?jù)傳入的Intent參數(shù)進(jìn)行實(shí)際的操作奋刽,比如會(huì)在此處創(chuàng)建一個(gè)線程用于下載數(shù)據(jù)或播放音樂(lè)等。 - onBind()
Service中的onBind()方法是抽象方法艰赞,Service類本身就是抽象類佣谐,所以onBind()方法是必須重寫(xiě)的,即使我們用不到方妖。 - onDestory()
在銷毀的時(shí)候會(huì)執(zhí)行Service該方法狭魂。
2、通過(guò)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可以通過(guò)IBinder接口獲取Service實(shí)例,從而實(shí)現(xiàn)在client端直接調(diào)用Service中的方法以實(shí)現(xiàn)靈活交互卒废,這在通過(guò)startService方法啟動(dòng)中是無(wú)法實(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)沒(méi)有任何client與Service綁定時(shí)电谣,Service會(huì)自行銷毀。
摘自 http://www.reibang.com/p/4c798c91a613
3抹蚀、IntentService和Service區(qū)別
Service
是長(zhǎng)期運(yùn)行在后臺(tái)的應(yīng)用程序組件剿牺。
Service 不是一個(gè)單獨(dú)的進(jìn)程,它和應(yīng)用程序在同一個(gè)進(jìn)程中环壤,Service 也不是一個(gè)線程,它和線程沒(méi)有任何關(guān)系晒来,所以它不能直接處理耗時(shí)操作。如果直接把耗時(shí)操作放在 Service 的 onStartCommand() 中郑现,很容易引起 ANR .如果有耗時(shí)操作就必須開(kāi)啟一個(gè)單獨(dú)的線程來(lái)處理IntentService
IntentService 是繼承于 Service 并處理異步請(qǐng)求的一個(gè)類湃崩,在 IntentService 內(nèi)有一個(gè)工作線程來(lái)處理耗時(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è)震放,以此類推宾毒。而且,所有請(qǐng)求都在一個(gè)單線程中殿遂,不會(huì)阻塞應(yīng)用程序的主線程(UI Thread)诈铛,同一時(shí)間只處理一個(gè)請(qǐng)求。