關於service的十件事情

這篇文章不會講解Service的使用方法,這個要去看官方的(被牆的)文檔:
http://developer.android.com/guide/components/services.html
https://developer.android.com/intl/pt-br/reference/android/app/Service.html
http://developer.android.com/training/run-background-service/index.html
這篇文章總結了對於掌握Service至關重要卻常常被忽視、誤解、忘記的概念。

1. Service不是更好的AsyncTask

Service不是用來執行異步、後臺操作的,它被創造的目的就是在Activity不可見時仍能執行邏輯,要把Service想成不可見的Activity。

要記住每個Service都是有使用成本的特殊組件,不只是對於APP,更是對整個系統。

2. 默認情況下Service在主線程運行

可以選擇讓Service在其他線程運行,但除非必要情況時應儘量避免這麼做,因爲這麼做是有代價的。

3. IntentService並不神奇

IntentService是通過創建一個HandlerThread並在其中排列邏輯來工作的,可以很輕鬆的跳出Service實現這種方式。

IntentService是一個很簡單的類,只有164行代碼,去掉註釋74行,可以自己去看看。

4. 一個Service同時只能有一個實例

不管怎麼new,一個Service永遠只能有一個實例,即使外部APP/進程與它交互也是這樣。

5. Service很容易被幹掉

不要以爲內存少是很極端的情況,應該在編寫Service代碼時讓它可以很優雅的處理系統對它的重啓,這是生命週期的一部分。

可以把Service標記爲foreground讓它更難被幹掉,但應該只在必要時這麼做。

注意當執行onCreate()、onStartCommand()、onDestroy()方法時,Service被視作foreground雖然它並不是。

下面這個鏈接可以告訴你你的進程有多麼可能被幹掉。
https://developer.android.com/guide/components/processes-and-threads.html#Lifecycle

6. 一個Service可以在同時被啓動與綁定

明確的停止綁定了其他組件的Service並不會使它結束。解綁Service的所有組件而不結束它也不會使它停止。還有就是不論你調用startService()多少次,只需調用一次stopService()或stopSelf()就可以結束它。具體參考下圖:

7. STARTFLAGREDELIVERY可以避免輸入數據丟失

如果在啓動Service時傳入數據並在onStartCommand()中返回STARTFLAGREDELIVERY可以有效地避免在Service處理數據被殺死時丟失數據。

8. 前臺的通知可以被部分遮蓋

當一個前臺的Service要發送一個通知時,可以傳入一個優先級值PRIORITY_MIN來在狀態欄中隱藏它,而在通知欄中仍然可見。

9. Service可以啓動Activity

就像不是Activity的所有Context一樣,Service可以在添加FLAGACTIVITYNEW_TASK標記時啓動Activity。

還可以顯示Toast或狀態欄通知,一樣的道理。

10. 可以引入單一職責原則

最好不要在Service中寫邏輯代碼,而是分離在另一個類中,這樣除了可以複用外,說不定還有其他好處

發佈了39 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章