Android學習路線_入門篇(五)Service的生命週期與如何保活
Android應用開發中核心的四大元件是整體應用的骨架,利用好四大元件才能搭建出一個合理高效的APP。簡單瞭解了Service之後,我們再來深入一下Service的生命週期與如何保活。
本文已收錄至☞Android學習路線_梳理
上一篇☞Android學習路線_入門篇(四)四大元件之Service
1. Service的生命週期
1.1 啟動方式
上一篇文章已經仔細對Service的啟動方式做了一個介紹,我們先來回顧一下。
Service的啟動方式有兩種:startService()
和bindService()
。
- 使用
startService()
方法啟動Service,呼叫者與Service之間沒有關係,即使呼叫者退出了,Service仍然執行。Service不會自動銷燬,需要外部呼叫stopService()
方法或在Service內部呼叫stopSelf()
方法。 - 使用
bindService()
方法啟動Service,呼叫者與Service繫結在了一起,呼叫者一旦銷燬,Service也就終止了,呼叫者需要解綁時可呼叫unBindService()
方法。
1.2 生命週期
和啟動方式一樣,Service的生命週期也得分兩種情況,根據Service的啟動方式分為Unbounded
和Bounded
兩種,如下圖:
Unbounded
是Service被startService()
方法啟動時經歷的生命週期,Service不處於活動狀態時,經歷onCreate()
>onStartCommand()
流程進入活動狀態,此時再次啟動Service只呼叫onStartCommand()
方法。外部呼叫stopService()
方法或在Service內部呼叫stopSelf()
方法銷燬Service,此時Service的onDestroy()
方法被呼叫。Bounded
是Service被bindService()
方法啟動時經歷的生命週期,Service不處於繫結狀態時,經歷onCreate()
>onBind()
流程進入繫結狀態,此時再次繫結Service只呼叫onBind()
方法。外部呼叫unBindService()方法解綁Service或呼叫者被銷燬時,Service經歷onUnbind()
>onDestroy()
的過程。
2. Service保活
安卓系統有自動清理記憶體的機制,在一定情況下會自動殺死優先順序較低的元件,如記憶體不足、電量過低、長時熄屏等等。其實Service保活只是提升Service存活的可能性,儘可能不給系統自動殺死Service的機制。
2.1 onStartCommand() 方法的返回值
相信有小夥伴在上一篇文章中已經看到了onStartCommand()
方法有一個返回值,我們目前是預設返回了父類的方法返回值super.onStartCommand(intent, flags, startId)
。
而這個方法可以有四種返回值,不同值代表的意思如下:
- START_STICKY:如果 service 程式被 kill 掉,保留 service 的狀態為開始狀態,但不保留遞送的 intent 物件。隨 後系統會嘗試重新建立 service,由於服務狀態為開始狀態,所以建立服務後一定會呼叫
onStartCommand(Intent,int,int)
方法。如果在此期間沒有任何啟動命令被傳遞到 service,那麼引數 Intent 將為 null。 - START_NOT_STICKY:“非粘性的”。使用這個返回值時,如果在執行完
onStartCommand()
後,服務被異常 kill 掉,系統不會自動重啟該服務。 - START_REDELIVER_INTENT:重傳 Intent。使用這個返回值時,如果在執行完
onStartCommand()
後,服務被異 常 kill 掉,系統會自動重啟該服務,並將 Intent 的值傳入。 - START_STICKY_COMPATIBILITY:
START_STICKY
的相容版本,但不保證服務被 kill 後一定能重啟。
2.2 如何保證Service不被殺死?
- 在
AndroidManifest.xml
檔案中對於intent-filter
可以通過android:priority = “1000”
這個屬性設定最高優先順序,1000是最高值,如果數字越小則優先順序越低,同時實用於廣播。 - 在
onStartCommand()
裡面呼叫startForeground()
方法把Service提升為前臺程式級別,然後再onDestroy裡面要記得呼叫stopForeground()
方法。 - onStartCommand方法,手動返回
START_STICKY
。 - 在onDestroy方法裡發廣播重啟service。
service +broadcast
方式,就是當service走onDestory的時候,傳送一個自定義的廣播,當收到廣播的時候,重新啟動service。(第三方應用或是在setting裡-應用-強制停止時,APP程式就直接被幹掉了,onDestroy方法都進不來,所以無法保證會執行)可以通過雙Service互相喚起,提高成功率。 - 監聽系統廣播判斷Service狀態。通過系統的一些廣播,比如:手機重啟、介面喚醒、應用狀態改變等等監聽並捕獲到,然後判斷我們的Service是否還存活,若被殺死則重新啟動Service。
- Application加上Persistent屬性。
完畢
今天的分享就到這裡,文章多有不足,各位小夥伴有什麼想法可以直接評論或是私信,要是對你有所幫助就給我一個贊吧,喜歡我的小夥伴可以關注我哦~
本文已收錄至☞Android學習路線_梳理
上一篇☞Android學習路線_入門篇(四)四大元件之Service
支援我的小夥伴們可以微信搜尋“Android思維庫”,或者微信掃描下方二維碼,關注我的公眾號,每天都會推送新知識~
相關文章
- Android Service生命週期淺析Android
- Java開發學習(五)----bean的生命週期JavaBean
- Android中bindService的使用及Service生命週期Android
- Android中startService的使用及Service生命週期Android
- ReactNative學習筆記五之生命週期React筆記
- Service生命週期詳解
- 學習vue生命週期Vue
- Android學習筆記04——Activity的生命週期Android筆記
- Android入門教程之Activity(生命週期,啟動...)Android
- android基礎學習-android篇day17-Activity的生命週期(轉)Android
- Android Service生命週期 Service裡面的onStartCommand()方法詳解Android
- Vue入門(三)Vue生命週期Vue
- 深入學習Activity生命週期
- vue生命週期整理學習Vue
- [譯] JavaScript 是如何工作的:Service Worker 的生命週期與使用場景JavaScript
- View生命週期與Activity生命週期的關係View
- Angular學習(二):元件-生命週期Angular元件
- React生命週期學習筆記React筆記
- 036.Vue3入門,元件的生命週期Vue元件
- Flutter系列五:State的生命週期Flutter
- [Android]Activity的生命週期Android
- Android MediaPlayer的生命週期Android
- android:碎片的生命週期Android
- 如何學習Python?Python學習入門路線Python
- Android Activity生命週期Android
- 學習筆記|AS入門(十) 元件篇之Service筆記元件
- Vue學習(三)生命週期函式Vue函式
- ReactJS前端學習-元件生命週期ReactJS前端元件
- Java學習路線·入門Java
- PWA:Service worker生命週期事件對網路資源的處理事件
- JavaScript 是如何工作的:Service Worker 的生命週期及使用場景JavaScript
- vue - 生命週期第二次學習與理解Vue
- Vue學習筆記(2)—— Vue的生命週期Vue筆記
- ReactNative入門教程-元件生命週期函式React元件函式
- Android學習路線(十三)Activity生命週期——暫停和恢復(Pausing and Resuming )一個Activity...Android
- Mybatis學習-配置、作用域和生命週期MyBatis
- Vue原始碼學習(八):生命週期呼叫Vue原始碼
- Apple Watch學習之路 生命週期研究APP