Android里面的Service種類以及啟動方式
一句話總結(jié):
Service 是 Android 的“后臺打工人”,分兩種類型(前臺和后臺),兩種啟動方式(自己干、和人合作干),不同場景用不同姿勢。
一、Service 的兩種類型:
1. 前臺服務(wù)(必須亮身份牌)
特點:必須顯示一個常駐通知(像外賣小哥穿著工服),告訴用戶“我正在后臺干活”,避免被系統(tǒng)干掉。
適用場景:
- 音樂播放(顯示播放通知)。
- 文件下載(顯示進度條)。
- 定位跟蹤(如導(dǎo)航)。
代碼示例:
val notification = buildNotification() // 創(chuàng)建通知 startForeground(1, notification) // 變成前臺服務(wù)
2. 后臺服務(wù)(偷偷干活,但容易被抓)
特點:沒有通知,默默干活,但 Android 8.0 之后限制嚴格(長時間后臺運行會被系統(tǒng)限制)。
適用場景:
- 臨時任務(wù)(如數(shù)據(jù)同步)。
- 輕量任務(wù)(如定時提醒)。
注意:高版本 Android 中,后臺服務(wù)可能無法長期存活,建議改用
WorkManager
或JobScheduler
。
二、Service 的兩種啟動方式:
1. 獨立干活(startService)
特點:
- 通過
startService()
啟動,Service 會一直運行,直到主動調(diào)用stopSelf()
或其他組件調(diào)用stopService()
。 - 生命周期:
onCreate()
→onStartCommand()
→ (運行中) →onDestroy()
。
- 通過
適用場景:
- 需要長期運行的任務(wù)(如播放音樂)。
- 不依賴其他組件的獨立任務(wù)。
代碼示例:
// 啟動服務(wù) val intent = Intent(this, MyService::class.java) startService(intent) // 停止服務(wù) stopService(intent)
2. 和人合作干(bindService)
特點:
- 通過
bindService()
啟動,Service 和組件(如 Activity)綁定,綁定解除后 Service 可能被銷毀。 - 生命周期:
onCreate()
→onBind()
→ (運行中) →onUnbind()
→onDestroy()
。 - 可以通過
IBinder
接口實現(xiàn)組件和 Service 的雙向通信(比如控制音樂播放進度)。
- 通過
適用場景:
- 需要與界面交互的任務(wù)(如控制下載進度)。
- 多個組件共享同一個 Service。
代碼示例:
// 綁定服務(wù) val connection = object : ServiceConnection { override fun onServiceConnected(name: ComponentName?, binder: IBinder?) { // 獲取 Service 的接口,進行交互 } override fun onServiceDisconnected(name: ComponentName?) {} } bindService(intent, connection, Context.BIND_AUTO_CREATE) // 解綁服務(wù) unbindService(connection)
三、混合模式(start + bind)
特點:
- 先
startService()
讓 Service 長期運行,再bindService()
進行交互。 - 適用場景:音樂播放器(長期播放 + 界面控制進度)。
- 先
銷毀條件:必須同時調(diào)用
stopService()
和unbindService()
才會銷毀。
四、IntentService(已過時,但要知道)
特點:
- 自帶工作線程,任務(wù)按順序執(zhí)行,干完活自動關(guān)閉。
- Android 8.0 后受限,推薦改用
WorkManager
或JobIntentService
。
代碼示例:
class MyIntentService : IntentService("MyIntentService") { override fun onHandleIntent(intent: Intent?) { // 在子線程執(zhí)行耗時任務(wù) } }
五、如何選擇啟動方式?
場景 | 啟動方式 | 類型 |
---|---|---|
長期任務(wù)(如音樂播放) | startService() | 前臺服務(wù) |
臨時交互(如下載控制) | bindService() | 綁定服務(wù) |
輕量后臺任務(wù)(如數(shù)據(jù)同步) | WorkManager | 后臺服務(wù)替代 |
總結(jié)
前臺服務(wù):要亮通知,適合用戶感知的任務(wù)。
后臺服務(wù):盡量少用,高版本 Android 限制多。
啟動方式:
- 獨立干:用
startService()
,記得關(guān)。 - 合作干:用
bindService()
,綁定完記得解。
- 獨立干:用
口訣:
- “長期亮牌用前臺,臨時合作用綁定,高版本別硬杠,WorkManager 更穩(wěn)當” 。
以上就是Android里面的Service種類以及啟動方式的詳細內(nèi)容,更多關(guān)于Android Service種類及啟動的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決Android Studio4.1沒有Gsonfomat插件,Plugin “GsonFormat” is inco
這篇文章主要介紹了解決Android Studio4.1沒有Gsonfomat插件,Plugin “GsonFormat” is incompatible (supported only in IntelliJ IDEA)的問題 ,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-12-12Android編程實現(xiàn)泡泡聊天界面實例詳解(附源碼)
這篇文章主要介紹了Android編程實現(xiàn)泡泡聊天界面,結(jié)合實例形式較為詳細的分析了Android泡泡聊天界面的窗體定義與功能實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11Android studio2.3.3升級到3.1.2坑(小記)
這篇文章主要介紹了Android studio2.3.3升級3.1.2坑(小記),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09Android 5.0+ 屏幕錄制實現(xiàn)的示例代碼
這篇文章主要介紹了Android 5.0+ 屏幕錄制實現(xiàn)的示例代碼,從 5.0 開始,系統(tǒng)提供給了 app 錄制屏幕的一系列方法,不需要 root 權(quán)限,只需要用戶授權(quán)即可錄屏,相對來說較為簡單,感興趣的小伙伴們可以參考一下2018-05-05Android 出現(xiàn)的警告(Service Intent must be explicit)解決辦法詳解
這篇文章主要介紹了Android 出現(xiàn)的警告(Service Intent must be explicit)解決辦法詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04Android Usb設(shè)備的監(jiān)聽(Dev)外設(shè)端口的判定以及耳機的插拔
今天小編就為大家分享一篇關(guān)于Android Usb設(shè)備的監(jiān)聽(Dev)外設(shè)端口的判定以及耳機的插拔,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12Android利用MPAndroidChart繪制曲線圖表的基礎(chǔ)教程
最近在項目中要用到曲線圖,于是在網(wǎng)上找了很多很多,有AChartengine,MPAndroidChart,helloChart等等,我還用過基于html5的jsChart來做過,不過最終還是選擇了MPAndroidChart來做本文介紹了Android利用MPAndroidChart繪制曲線圖表的基礎(chǔ)教程,需要的朋友可以參考下。2018-03-03