Android學習路線_入門篇(五)Service的生命週期與如何保活

coder-ice發表於2020-11-23

Android應用開發中核心的四大元件是整體應用的骨架,利用好四大元件才能搭建出一個合理高效的APP。簡單瞭解了Service之後,我們再來深入一下Service的生命週期與如何保活。

本文已收錄至☞Android學習路線_梳理
上一篇☞Android學習路線_入門篇(四)四大元件之Service

1. Service的生命週期

1.1 啟動方式

上一篇文章已經仔細對Service的啟動方式做了一個介紹,我們先來回顧一下。

Service的啟動方式有兩種:startService()bindService()

  1. 使用startService()方法啟動Service,呼叫者與Service之間沒有關係,即使呼叫者退出了,Service仍然執行。Service不會自動銷燬,需要外部呼叫stopService()方法或在Service內部呼叫stopSelf()方法。
  2. 使用bindService()方法啟動Service,呼叫者與Service繫結在了一起,呼叫者一旦銷燬,Service也就終止了,呼叫者需要解綁時可呼叫unBindService()方法。

1.2 生命週期

和啟動方式一樣,Service的生命週期也得分兩種情況,根據Service的啟動方式分為UnboundedBounded兩種,如下圖:
Service生命週期

  1. Unbounded是Service被startService()方法啟動時經歷的生命週期,Service不處於活動狀態時,經歷onCreate() > onStartCommand()流程進入活動狀態,此時再次啟動Service只呼叫onStartCommand()方法。外部呼叫stopService()方法或在Service內部呼叫stopSelf()方法銷燬Service,此時Service的onDestroy()方法被呼叫。
  2. 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)

而這個方法可以有四種返回值,不同值代表的意思如下:

  1. START_STICKY:如果 service 程式被 kill 掉,保留 service 的狀態為開始狀態,但不保留遞送的 intent 物件。隨 後系統會嘗試重新建立 service,由於服務狀態為開始狀態,所以建立服務後一定會呼叫 onStartCommand(Intent,int,int)方法。如果在此期間沒有任何啟動命令被傳遞到 service,那麼引數 Intent 將為 null。
  2. START_NOT_STICKY:“非粘性的”。使用這個返回值時,如果在執行完 onStartCommand() 後,服務被異常 kill 掉,系統不會自動重啟該服務。
  3. START_REDELIVER_INTENT:重傳 Intent。使用這個返回值時,如果在執行完 onStartCommand() 後,服務被異 常 kill 掉,系統會自動重啟該服務,並將 Intent 的值傳入。
  4. START_STICKY_COMPATIBILITYSTART_STICKY 的相容版本,但不保證服務被 kill 後一定能重啟。

2.2 如何保證Service不被殺死?

  1. AndroidManifest.xml檔案中對於intent-filter可以通過android:priority = “1000”這個屬性設定最高優先順序,1000是最高值,如果數字越小則優先順序越低,同時實用於廣播。
  2. onStartCommand()裡面呼叫 startForeground()方法把Service提升為前臺程式級別,然後再onDestroy裡面要記得呼叫stopForeground()方法。
  3. onStartCommand方法,手動返回START_STICKY
  4. 在onDestroy方法裡發廣播重啟service。service +broadcast 方式,就是當service走onDestory的時候,傳送一個自定義的廣播,當收到廣播的時候,重新啟動service。(第三方應用或是在setting裡-應用-強制停止時,APP程式就直接被幹掉了,onDestroy方法都進不來,所以無法保證會執行)可以通過雙Service互相喚起,提高成功率。
  5. 監聽系統廣播判斷Service狀態。通過系統的一些廣播,比如:手機重啟、介面喚醒、應用狀態改變等等監聽並捕獲到,然後判斷我們的Service是否還存活,若被殺死則重新啟動Service。
  6. Application加上Persistent屬性。

完畢

今天的分享就到這裡,文章多有不足,各位小夥伴有什麼想法可以直接評論或是私信,要是對你有所幫助就給我一個贊吧,喜歡我的小夥伴可以關注我哦~

本文已收錄至☞Android學習路線_梳理
上一篇☞Android學習路線_入門篇(四)四大元件之Service

支援我的小夥伴們可以微信搜尋“Android思維庫”,或者微信掃描下方二維碼,關注我的公眾號,每天都會推送新知識~
在這裡插入圖片描述

相關文章