**: rlei
把service等同於thread或process是乙個非常常見的誤解。需要
強調又強調
的第一點是,android的service是乙個context,
並不必然等於乙個額外的thread
),裡面專門強調
為什麼強調說"longer running"的"component"? 非常明顯,這裡是和activity這種活躍週期相對短暫的component對比而言。一旦使用者切換到其他應用,當前activity就必須pause, stop甚至被destroy,不能在後台處理其他事務。需要強調的事,嚴格來說你仍然可以在activity裡建立自己的worker thread或async task之類做後台的事情,但這樣做沒有任何保障——因為一旦你所有的activity都被切換到了後台,系統隨時可能kill掉你的process,你的後台任務隨時可能悄無聲息的死掉。
activity為什麼這樣設計?windows下面的視窗在最小化的時候不是一樣可以處理訊息或者繼續執行嗎?這是另外乙個話題,不過回答也很簡單:這是移動裝置,記憶體/電池都有限。
對你的應用而言,通過在manifest裡宣告service,把需要後台相對長期執行的邏輯放在service裡,你便獲得了這樣的保障:只要系統記憶體不是極端不夠用,你的service一定不會被kill掉。對系統而言,當看到乙個程序裡有service在執行,這個程序就具有較高的優先順序,會在記憶體不足被殺的行列裡排得比較靠後。
可是前面不是強調了service並不等於process或thread嗎?為什麼上面又在說殺程序什麼的?這裡再次強調,你可以把service看成一砣**,用來在後台做些事情,僅此而已。至於這砣**在**執行,完全是取決於你自己的喜好。你的local service,如果不建立worker thread,仍然是在你的應用程序的主線程即ui執行緒裡執行。如果你不想阻塞ui執行緒,你就建乙個worker thread。但這些細節,android framework並不怎麼care,它只知道你宣告了乙個service,然後在你的manifest裡面找到這個service是宣告在哪個process裡執行,那麼這個process就不容易被kill。
什麼時候選擇local service(即不指定額外的程序),什麼時候選擇remote service(額外的程序)?通常我們會把真的需要長期執行的service(例如im之類)放在單獨的程序裡,這樣ui所在的程序在必要的時候仍然可以被系統kill掉來騰出記憶體。而local service通常用來處理一些需要短期執行但仍然超出activity活動週期的任務,打個比方,傳送簡訊或彩信。這樣的任務執行完以後,service就可以stop自己,仍然不妨礙整個ui程序被**掉。
在Android中Service概述和AIDL例子
service的主要用途是提供後台服務呼叫,與activity不同,service沒有介面,也正因為如此,它不像activity那樣當使用者離開應用介面就停止,service則一直在後台執行,除非明確命令其停止。service也有生命週期的。當啟動service時,首先呼叫oncreate 方法,然...
Android中Service服務和活動進行通訊
本文給自己簡單複習一下,不多說廢話 android name myservice android enabled true android exported true service 編寫myservice public class myservice extends service public ...
Service是android 系統中的一種元件
service是android 系統中的一種元件,它跟activity的級別差不多,但是他不能自己執行,只能後台執行,並且可以和其他元件進行互動。android開發的過程中,每次呼叫startservice intent 的時候,都會呼叫該service物件的onstartcommand inten...