Service#onStartCommand返回值解析
Service#onStartCommand返回值解析
Service
類有個生命週期方法叫onStartCommand
,每次啟動服務(startService)都會回撥此方法。此方法的原型如下:
public int onStartCommand(Intent intent, int flags, int startId)
需要關注的是這個方法有一個整型的返回值,它有以下選項:
START_STICKY_COMPATIBILITY
START_STICKY
START_NOT_STICKY
START_REDELIVER_INTENT
那麼這幾種返回值有什麼作用呢?
通過閱讀文件,我發現它們將影響服務異常終止
情況下重啟服務時的行為,預設情況下,當我們的服務因為系統記憶體吃緊或者其他原因被異常終止時,系統會嘗試在某個時刻重新啟動服務,這時,如果Service#onStartCommand
方法返回
- START_NOT_STICKY:
服務不會重新建立,除非你再次呼叫startService
START_STICKY/START_STICKY_COMPATIBILITY:
服務重新建立並啟動,依次回撥onCreate,onStartCommand,但是如果沒有新的intent傳給此service,onStartCommand
接受的將是一個空的intent
。
START_STICKY_COMPATIBILITY是START_STICKY的相容版本,2.0之下使用,它不保證一定呼叫onStartCommand
.START_REDELIVER_INTENT:
服務重新建立並啟動,依次回撥onCreate,onStartCommand,並且會把最後一次傳給此服務的intent
重新發給onStartCommand
。
系統預設策略
Service的onStartCommand策略:
public int onStartCommand(Intent intent, int flags, int startId) {
onStart(intent, startId);
return mStartCompatibility ? START_STICKY_COMPATIBILITY : START_STICKY;
}
可見,預設的策略是START_STICKY,支援服務意外終止重新建立的。
IntentService的實現策略:
IntentService
不應該重新實現onStartCommand
,而是去複寫onHandleIntent
.
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
public void setIntentRedelivery(boolean enabled) {
mRedelivery = enabled;
}
可見,IntentService
預設只支援兩種返回值START_REDELIVER_INTENT
或者START_NOT_STICKY
,並且由setIntentRedelivery
方法決定,預設是START_NOT_STICKY
,不重新建立。
測試:
測試機:nexus5,android6.0
注:這裡的kill service模擬的是服務意外被殺死的情形,這裡我通過使用nexus的
close background apps
功能,即點選menu鍵,滑掉啟動的app。由於這種做法是由系統殺死service,因而不會回撥service
的生命週期方法onDestroy
onStartCommand返回Service.START_STICKY
- kill Service:
service會重啟,並重新執行
onCreate
和onStartCommand
方法,注意重啟後執行onStartCommand
時的intent
引數將會是null
- stop Service:
僅執行
onDestroy
,不會重啟服務
onStartCommand返回Service.START_NOT_STICKY
- kill Service:
service不會重啟
- stop Service:
僅執行
onDestroy
,不會重啟服務
onStartCommand返回Service.START_REDELIVER_INTENT
- kill Service:
service會重啟,並重新執行
onCreate
和onStartCommand
方法,注意重啟後執行onStartCommand
時的intent
引數不為null
,也就是說會重新傳送之前的intent。
- stop Service:
僅執行
onDestroy
,不會重啟服務
相關文章
- 微信對賬單介面返回值解析
- $(document).scrollTop()返回值始終是0解析
- 獲取的ajax方法return的返回值的問題解析
- Laravel 返回值Laravel
- typeof返回值
- phpexplode()返回值PHP
- 全面解析Js陣列遍歷對原陣列的影響及返回值JS陣列
- Java異常處理場景中不同位置的返回值詳細解析Java
- 關於RHEL 5 下scsi_id 無返回值的問題解決(2) 完全解析
- typeof返回值詳解
- 函式的返回值函式
- WebAPI服務返回值WebAPI
- 函式返回值1函式
- javascript typeof undefined 返回值JavaScriptUndefined
- Js 的 typeof 返回值JS
- 0305函式返回值函式
- requests返回值cookies轉字典Cookie
- 一個返回值函式函式
- typeof操作符 返回值
- 如何理解Return的返回值?
- 對於返回值型別不確定的函式如何限定返回值型別型別函式
- Python的and和or的返回值Python
- HTTP 返回值標準含義HTTP
- ajax+ashx返回值詳解
- .Net MinimalApis響應返回值API
- C語言中函式的返回值C語言函式
- CQRS中命令可以返回值嗎? -OSKAR
- Go中多個返回值的技巧Go
- 商品詳情 API 返回值說明API
- javascript建構函式的返回值JavaScript函式
- 深入分析python的and or 返回值Python
- main函式返回值的處理AI函式
- 多型中的返回值型別多型型別
- cin和scanf的返回值知多少
- go-zero統一Response的返回值Go
- 理解String的compareTo()方法返回值
- springMVC中controller的返回值SpringMVCController
- JavaSE 形參和返回值(引用型別)Java型別