對(duì)于Service,看了很多遍相應(yīng)的demo代碼,但是項(xiàng)目中從來沒有用過,貌似也沒有什么功能非要用到service.
但是Service既然存在,就一定有存在的道理。
轉(zhuǎn):
Android Service完全解析,關(guān)于服務(wù)你所需知道的一切(上)
Android Service完全解析,關(guān)于服務(wù)你所需知道的一切(下)
由此證實(shí)了Service確實(shí)是運(yùn)行在主線程里的,也就是說如果你在Service里編寫了非常耗時(shí)的代碼,程序必定會(huì)出現(xiàn)ANR的。
你可能會(huì)驚呼,這不是坑爹么?。磕俏乙猄ervice又有何用呢?其實(shí)大家不要把后臺(tái)和子線程聯(lián)系在一起就行了,這是兩個(gè)完全不同的概念。Android的后臺(tái)就是指,它的運(yùn)行是完全不依賴UI的。即使Activity被銷毀,或者程序被關(guān)閉,只要進(jìn)程還在,Service就可以繼續(xù)運(yùn)行。比如說一些應(yīng)用程序,始終需要與服務(wù)器之間始終保持著心跳連接,就可以使用Service來實(shí)現(xiàn)。你可能又會(huì)問,前面不是剛剛驗(yàn)證過Service是運(yùn)行在主線程里的么?在這里一直執(zhí)行著心跳連接,難道就不會(huì)阻塞主線程的運(yùn)行嗎?當(dāng)然會(huì),但是我們可以在Service中再創(chuàng)建一個(gè)子線程,然后在這里去處理耗時(shí)邏輯就沒問題了。
額,既然在Service里也要?jiǎng)?chuàng)建一個(gè)子線程,那為什么不直接在Activity里創(chuàng)建呢?這是因?yàn)锳ctivity很難對(duì)Thread進(jìn)行控制,當(dāng)Activity被銷毀之后,就沒有任何其它的辦法可以再重新獲取到之前創(chuàng)建的子線程的實(shí)例。而且在一個(gè)Activity中創(chuàng)建的子線程,另一個(gè)Activity無法對(duì)其進(jìn)行操作。但是Service就不同了,所有的Activity都可以與Service進(jìn)行關(guān)聯(lián),然后可以很方便地操作其中的方法,即使Activity被銷毀了,之后只要重新與Service建立關(guān)聯(lián),就又能夠獲取到原有的Service中Binder的實(shí)例。因此,使用Service來處理后臺(tái)任務(wù),Activity就可以放心地finish,完全不需要擔(dān)心無法對(duì)后臺(tái)任務(wù)進(jìn)行控制的情況。