Service的onStartCommand方法空指針錯誤
在由于項目需要,在開發中使用了Service,但是測試發現有時會程式會崩潰掉,通過查閱log發現以下提示
查閱DownloadService.java源碼發現是onStartCommand()方法報錯,
而錯誤很明顯是傳入的intent為空。
于是找了下資料,發現傳入intent為空是因為service被異常幹掉,系統重新開機service是就會傳入空intent。原因是找到了,如何解決呢?
有兩種方法
第一種:
在需要使用intent之前做判空操作。
第二種:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
...
return Service.START_REDELIVER_INTENT;
}
第一種好了解,第二種方法又時什麼意思呢?
onStartComand使用時,傳回的是一個(int)整形。這個整形可以有四個傳回值:START_STICKY 、START_NOT_STICKY 、START_REDELIVER_INTENT 、START_STICKY_COMPATIBILITY。
它們的含義分别是:
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_COMPATIBILITY:START_STICKY的相容版本,但不保證服務被kill後一定能重新開機。
onStartComand參數flags含義
flags表示啟動服務的方式:
Additional data about this start request. Currently either 0, START_FLAG_REDELIVERY, or START_FLAG_RETRY.
START_FLAG_REDELIVERY: 如果你實作onStartCommand()來安排異步工作或者在另一個線程中工作, 那麼你可能需要使用START_FLAG_REDELIVERY來讓系統重新發送一個intent。這樣如果你的服務在處理它的時候被Kill掉, Intent不會丢失.
START_FLAG_RETRY:表示服務之前被設為START_STICKY,則會被傳入這個标記。