2012-02-09 34 views
0

我有一個正在播放音樂的服務。我實現了fade out這樣Android:調用服務的super.onDestroy()外onDestroy()

@Override 
public void onDestroy(){ 
    volume=1.0f; 
    fade_handler.post(fade_out); 
    super.onDestroy(); 
} 

這是fade_out Runnable接口

private Runnable fade_out = new Runnable(){ 
    public void run(){ 
     player.setVolume(volume, volume); 
     if(volume>0.0f){ 
      volume-=0.05f; 
      fade_handler.postDelayed(fade_out, 200); 
     } 
     else{ 
      player.stop(); 
      player.release(); 
      stopForeground(true); 
      //here should be super.onDestroy()!!!!!!! 
     } 
    } 
}; 

的問題是,現在super.onDestroy()獲取的調用之前fade_out結束 - 所以我想打電話super.onDestroy()裏面這個runnable - 但如何

回答

2

onDestroy()中做這樣的事情並不是最好的主意,因爲這種方法應該做清理。我建議你做以下幾點:

  • 創建一個方法,如void fadeOutAndStop()
  • 將其設置爲發佈Runnable,以淡化音量並調用stopSelf()(或您現在用來停止服務的方法)。
  • 當您需要停止服務時,請使用fadeOutAndStop()方法。

這樣你甚至不需要做任何特別的工作onDestroy(),而且設計會更乾淨。

+0

謝謝,這確實似乎是一個更好的解決方案。有一件事 - 我怎麼從我的活動中調用這個函數?使用[AIDL](http://developer.android.com/guide/developing/tools/aidl.html)?我之前所做的只是stopService(intent)。 – 2012-02-09 09:48:37

+0

我想我找到了答案。我需要綁定該服務。 – 2012-02-09 09:58:05

+0

@PrimožKralj不,不,AIDL是一種矯枉過正。除非您正在進行一些進程間通信或多線程,否則您只需要[Binder](http://developer.android.com/guide/topics/fundamentals/bound-services.html#Binder)。 – Malcolm 2012-02-09 10:00:20

1

正確的語法是YourServiceClassName.super.onDestroy(),但正如Malcolm指出它不是一個好主意。

相關問題