Android 安卓:呼叫服务';s super.ondestory()在ondestory()之外

Android 安卓:呼叫服务';s super.ondestory()在ondestory()之外,android,handler,ondestroy,Android,Handler,Ondestroy,我有一个服务是播放音乐。我已经像这样实现了: @Override public void onDestroy(){ volume=1.0f; fade_handler.post(fade_out); super.onDestroy(); } private Runnable fade_out = new Runnable(){ public void run(){ player.setVolume(volume, volume);

我有一个服务是播放音乐。我已经像这样实现了

@Override
public void onDestroy(){
    volume=1.0f;
    fade_handler.post(fade_out);
    super.onDestroy();  
}
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()!!!!!!!
        }
    }
};
这是“渐弱”可运行的:

@Override
public void onDestroy(){
    volume=1.0f;
    fade_handler.post(fade_out);
    super.onDestroy();  
}
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()get在fade out完成之前被调用-所以我想在这个runnable中调用super.onDestroy()-,但是如何执行呢?

onDestroy()
中这样做不是最好的主意,因为这个方法应该进行清理。我建议您执行以下操作:

  • 创建一个类似于
    void fadeOutAndStop()
    的方法
  • 将其设置为发布一个Runnable,它会淡出音量和调用
    stopSelf()
    (或您现在用来停止服务的方法)
  • 需要停止服务时,请使用
    fadeOutAndStop()
    方法

这样,您甚至不需要在
onDestroy()
中执行任何特殊操作,设计也会更干净。

onDestroy()
中执行类似操作不是最好的主意,因为此方法应该执行清理。我建议您执行以下操作:

  • 创建一个类似于
    void fadeOutAndStop()
    的方法
  • 将其设置为发布一个Runnable,它会淡出音量和调用
    stopSelf()
    (或您现在用来停止服务的方法)
  • 需要停止服务时,请使用
    fadeOutAndStop()
    方法

这样,您甚至不需要在onDestroy()中执行任何特殊的操作,设计也会更简洁。

正确的语法应该是YourServiceClassName.super.onDestroy(),但正如马尔科姆指出的那样,这不是一个好主意。

正确的语法应该是YourServiceClassName.super.onDestroy(),但正如马尔科姆指出的那样,这不是一个好主意。

谢谢,这似乎确实是一个更好的解决方案。但是有一件事-如何从活动中调用此函数?使用?我之前所做的就是停止服务(意图)。我想我找到了答案。我需要绑定服务。@PrimožKralj不,不,AIDL是个过火的家伙。您所需要的只是一个进程间通信或多线程。啊,spasiba;)还有一个简短的问题:如果我在活动中使用bindService(…),那么使用stopSelf()停止服务可以吗?还是应该在活动结束后以某种方式解除绑定?@PrimožKraljббббббб<无论您是否绑定到服务,code>stopSelf()都完全可以使用。事实上,如果您使用
startService(Intent)
,甚至需要显式停止服务。谢谢,这确实是一个更好的解决方案。但是有一件事-如何从活动中调用此函数?使用?我之前所做的就是停止服务(意图)。我想我找到了答案。我需要绑定服务。@PrimožKralj不,不,AIDL是个过火的家伙。您所需要的只是一个进程间通信或多线程。啊,spasiba;)还有一个简短的问题:如果我在活动中使用bindService(…),那么使用stopSelf()停止服务可以吗?还是应该在活动结束后以某种方式解除绑定?@PrimožKraljббббббб<无论您是否绑定到服务,code>stopSelf()都完全可以使用。事实上,如果使用
startService(Intent)
,甚至需要显式停止服务。