2012-02-09 82 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指出它不是一个好主意。