2017-10-04 106 views
1

我正在開發一款安卓應用來播放音樂。用於播放音樂的Android服務:爲什麼START_STICKY?

到目前爲止,我所傳回的負責播放音樂沒有太多的思想監守在Eclipse中的提示服務的onStartCommandSTART_STICKY指出:「這種模式是有道理的,[...]服務執行後臺音樂播放」。

這種方法所做的第一件事就是查看它應該做什麼(播放,停止,下一首歌......)。

最近,當我在播放音樂時將應用程序殺死(通過將它從最近的應用程序概覽中拖出屏幕),應用程序崩潰。查看日誌文件,我發現嘗試訪問onStartCommand中的意圖時(在調用Apllications和Service的onCreate方法之後),拋出了NullPointerException。

我的第一個反應是,因此在onStartCommand方法的開頭插入:

if (intent == null){ 
    stopSelf(); 
    return START_NOT_STICKY; 
} 

但閱讀的START_STICKYSTART_NOT_STICKY我再次納悶的描述後:爲什麼會START_STICKY被推薦用於音樂播放器?

我的理解是,兩者的區別在於,如果一個以START_STICKY開頭的服務被終止,它將被重新啓動(然後使用intent = null)。使用START_NOT_STICKY服務將不會重新啓動(除非用戶請求它),因此它將始終以意向調用,我不需要檢查它是否爲空。

當用戶殺死應用程序時,似乎很明顯該服務不應該重新啓動。

另一種情況是,我可以想到服務可能會重新啓動的地方在於服務是否由於缺乏資源而被系統殺死。在這種情況下,我也不認爲用戶會希望音樂意外開始播放音樂,只是因爲有些資源可用。

以下兩個答案暗示的返回碼有沒有其他的意思不是不管,如果進程被殺死了應該重新啓動服務:

爲什麼START_STICKY推薦給音樂播放器?

+0

播放音樂並不需要一個新的service.Already當您使用媒體播放器類即使音樂是應該保持在後臺運行,而其他應用程序都在 – Anonymous

+0

@Anonymous創建服務前景? – jakun

+0

默認情況下,它會在後臺運行..只有當用戶從內存中清除最近的應用程序時,音樂纔會停止。例如,像spotify – Anonymous

回答

0

INT START_STICKY: 不斷從onStartCommand(意向,INT,INT)返回:如果在它啓動(從onStartCommand(意向,INT,INT)返回後)這個服務的過程中被殺死了,然後離開它在開始的狀態,但不保留這個交付的意圖。稍後系統將嘗試重新創建該服務。因爲它處於啓動狀態,它將保證在創建新的服務實例後調用onStartCommand(Intent,int,int);如果沒有任何掛起的啓動命令要傳遞給服務,它將被調用一個空的intent對象,所以你必須小心檢查這個。這種模式對於明確啓動和停止運行的東西是有意義的任意時間段,例如執行背景音樂播放的服務。

所以它是自exolanatory請參閱本STICKY SERVICE

+0

這意味着什麼意思是「將它保留在啓動狀態」,如果此服務的過程是封殺「?這聽起來像服務應該繼續運行,但似乎並不是這樣。當我殺了應用程序時,音樂停止(立即,在應用程序崩潰之前)。 – jakun

+0

爲什麼要重新啓動服務?我無法真正想象用戶會突然想要一個設備開始播放音樂(即使它不是他,而是在某個時間停止應用程序的操作系統)。 – jakun

+0

@jakun可能你已經在清單Stopwithtask中設置了一個屬性爲true,這就是爲什麼當你殺死應用程序服務stops.it不會突然開始自動播放你有控制權停止服務。 –

1

START_STICKY - 如果該服務被停止由於內存不足,然後服務重新當有足夠的可用內存,它從低內存恢復後。在這裏,您將失去之前可能計算的結果。

START_NOT_STICKY - 如果服務已停止,即使系統有足夠的內存,系統也不打擾重新啓動服務。

此外,當用戶殺死應用程序時,服務將不會被停止,除非您通過使用某些任務殺手來停止該進程。有關服務的更多信息,請查看此鏈接。

http://www.vogella.com/tutorials/AndroidServices/article.html

+0

關於「START_STICKY」和「START_NOT_STICKY」的含義:這與我在上述答案中看到的非常相似。我相信要理解兩者之間的差異。我的問題是:爲什麼START_STICKY推薦用於音樂播放器? – jakun

+0

好的來到這裏創建服務的音樂播放器的優勢是當音樂播放器應用程序被殺害,並且你已經創建了一首正在播放它的歌曲將不會被停止。使用START_STICKY將確保如果服務在獲得內存時被android系統殺死,它將重新啓動播放歌曲,但從一開始,但START_NOT_STICKY不會再次啓動該服務,除非您手動進入應用程序並播放歌曲 – Anonymous

+0

有關該應用程序的殺戮:我用滑動將它從最近的應用程序列表中刪除,主頁按鈕。這樣做,音樂立即停止播放,這對我來說顯然意味着服務停止了。該應用程序崩潰後,我回到了主屏幕。 – jakun