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
,不會重啟服務
相關文章
- 微信對賬單介面返回值解析
- 獲取的ajax方法return的返回值的問題解析
- typeof返回值
- Laravel 返回值Laravel
- Java異常處理場景中不同位置的返回值詳細解析Java
- 全面解析Js陣列遍歷對原陣列的影響及返回值JS陣列
- typeof返回值詳解
- 函式的返回值函式
- 0305函式返回值函式
- .Net MinimalApis響應返回值API
- requests返回值cookies轉字典Cookie
- springMVC中controller的返回值SpringMVCController
- Python的and和or的返回值Python
- 逗號表示式返回值
- HTTP 返回值標準含義HTTP
- 理解String的compareTo()方法返回值
- cin和scanf的返回值知多少
- 多型中的返回值型別多型型別
- 商品詳情 API 返回值說明API
- C語言中函式的返回值C語言函式
- CQRS中命令可以返回值嗎? -OSKAR
- Go中多個返回值的技巧Go
- vue js事件方法呼叫api並返回值VueJS事件API
- Asp.Net Core 統一Api返回值ASP.NETAPI
- 細說函式返回值與引數函式
- c++函式引數和返回值C++函式
- require的到底有沒有返回值?UI
- VS 返回值被忽略的解決方法
- go-zero統一Response的返回值Go
- shell指令碼獲取函式返回值指令碼函式
- Spring 呼叫 Stored Procedure 並獲取返回值Spring
- JavaSE 形參和返回值(引用型別)Java型別
- Python的函式形參和返回值Python函式
- 兄弟連go教程(13)函式 返回值Go函式
- Python爬蟲Post請求返回值為-1000Python爬蟲
- js中的typeof返回值的所有型別JS型別
- 函式的祕密之 函式返回值函式
- vue 中this.$emit()的返回值是什麼?VueMIT
- Future 和 FutureTask用於接收callable的返回值