天天看點

Service的onStartCommand方法空指針錯誤Service的onStartCommand方法空指針錯誤

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,則會被傳入這個标記。

繼續閱讀