2012-01-31 80 views
8

我在停止播放音頻文件的服務時遇到很大問題。我想在播放其他文件之前停止當前的服務。Android:stopService()不會調用onDestroy()!

活動:

public void playTrack(View view){  
    Intent i=new Intent(this,playService.class); 
    i.setAction("com.c0dehunterstudios.relaxer.PLAY"); 

    if(isPlaying){ 
      stopService(i); 
      isPlaying=false; 
      Log.v("ACTIVITY", "Stopping.."); 
    } 

    startService(i); 
    isPlaying=true; 
} 

服務:

public void OnDestroy(){ 
    Log.v("SERVICE","Service killed"); 
    player.stop(); 
    super.onDestroy(); 
} 

但可悲的是它不工作 - 事實上,它甚至不下來 「服務殺」 裏面的OnDestroy()。

我在做什麼錯?

回答

15

首先,它是onDestroy,而不是OnDestroy。其次,你必須使用@Override註釋的編譯時檢查,所以你的服務代碼應該看起來有點像這樣:

@Override 
public void onDestroy(){ 
    Log.v("SERVICE","Service killed"); 
    player.stop(); 
    super.onDestroy(); 
} 
+0

謝謝你,你解決了我的 「問題」。 – 2012-01-31 20:38:51

+4

此外,如果您使用的是Eclipse(因爲大多數人都在使用Android,我認爲),請嘗試養成使用「Source-> Override/Implement Methods」菜單命令的習慣 - 這將爲該函數創建一個存根準備好讓你填寫,並且你將無法在名字上輸入錯誤。 – 2012-01-31 20:43:55

+0

謝謝,很好的建議! – 2012-01-31 20:53:42

5

我有一個類似的問題,即使有正確的onDestroy設置 - 的答案可能是對於訪問此頁面的用戶非常有用。對我而言,onDestroy在stopService期間不會立即調用,有時候會很長一段時間 - 在應該停止時讓服務繼續工作。

答案是,這是預期的行爲 - 我可以猜測,但不完全知道爲什麼。所以我在這種情況下的解決方案是創建一個公共靜態方法來手動停止服務的動作,這發生在它被調用時,然後stopService()會在它自己的好時間調用onDestroy ...

In對於這個例子(這可能是很久沒有的情況下,我可能會決定保持服務運行,直到它預計相當的應用程序,但提供方式來更改音頻文件,而服務仍然活躍。

2

首先,您需要說明Android中有多少類型的服務AFAIK,有:

  • 前臺服務
  • 後臺服務。
  • 有約束的服務。
  • 意向服務。

這些服務以不同的方式停止。

  • 前景:只有當停止你有意通過調用在啓動該服務,或在其自己的服務調用stopItself()活動或片段stopService()停止。請注意只有這些方法觸發服務的onDestroy()
  • 背景:stopService()stopItself()與前景相同。此外,您應該知道該服務與活動或片段調用它在同一個線程中,因此如果您銷燬活動或片段,此服務也將停止,但不調用onDestroy()。它基本上破壞地下。因此,如果你想趕上當此服務停止,你需要添加android:stopWithTask="false"像這樣的清單文件中聲明服務時:在你的服務類

    <application> 
        //.... 
        <service android:name=".services.catchingStopService" 
         android:stopWithTask="false" /> 
        //.... 
    </application> 
    

    現在你可以重寫此方法觸發當過此服務停止:

    @Override 
    public void onTaskRemoved(Intent rootIntent) { 
        super.onTaskRemoved(rootIntent); 
        // Your job when the service stops. 
    } 
    
  • 約束:你需要你的自我的bindService()unbindService()來處理,你會發現它是完全一樣的starService()stopService()

  • 意圖:這種類型的服務在完成其工作時自行停止。您可以使用ResultReceiver在服務和活動或片段之間進行通信。這與BroadcastReceiver類似。您可以輕鬆地在Google上搜索示例。

總結:根據你的目的,選擇適合你的服務類型。他們都同意:

  • 不要指望onDestroy()知道什麼時候服務停止,因爲它有時被稱爲地下;更確切地說,onDestroy調用 時,stopService()或stopItSelf()調用(BoundService的作用方式與 相同,我想,但是通過類似的方法,也許unBind(),我沒有 測試呢)。
  • 使用屬性android:stopWithTask =「false」,而不是知道 服務何時真正停止。
  • 當設備關機或操作系統死亡時,所有類型的服務停止,如果 設備泄漏內存。
  • 你也應該看看國旗返回onStartCommand()到 能夠處理服務時停止再次重新啓動服務或 的東西。下面是一些關鍵詞,你可以搜索:
    • START_STICKY
    • <action android:name="android.intent.action.BOOT_COMPLETED" />
    • <action android:name="android.intent.action.ACTION_SHUTDOWN" />
    • <actionandroid:name="android.intent.action.QUICKBOOT_POWEROFF" />
相關問題