把Service等同於thread或process是一個非常常見的誤解。需要
強調又強調的第一點是,Android的Service是一個Context,
並不必然等於一個額外的thread。如果你有仔細看文檔(
Service | Android Developers),里面專門強調
為 什么強調說"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進程被回收掉。
- A Service is not a separate process. The Service object itself does not imply it is running in its own process; unless otherwise specified, it runs in the same process as the application it is part of.
- A Service is not a thread. It is not a means itself to do work off of the main thread (to avoid Application Not Responding errors).
為 什么強調說"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進程被回收掉。
轉自:
http://www.zhihu.com/question/19591125/answer/15998566
PS: 解釋的非常的透徹。