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() внутри этого исполняемого объекта — но как< /сильный>?


person c0dehunter    schedule 09.02.2012    source источник


Ответы (2)


Не лучшая идея делать подобные вещи в onDestroy(), потому что этот метод должен выполнять очистку. Я предлагаю вам сделать следующее:

  • Создайте метод наподобие void fadeOutAndStop().
  • Установите его для публикации Runnable, который затухает громкость и вызывает stopSelf() (или метод, который вы используете для остановки службы сейчас).
  • Используйте метод fadeOutAndStop(), когда вам нужно остановить службу.

Таким образом, вам даже не нужно будет делать ничего особенного в onDestroy(), а дизайн будет намного чище.

person Malcolm    schedule 09.02.2012
comment
Спасибо, это действительно кажется лучшим решением. Одна вещь, хотя - как мне вызвать эту функцию из моей деятельности? Используете AIDL? Все, что я делал раньше, это stopService (намерение). - person c0dehunter; 09.02.2012
comment
Думаю, я нашел ответ. Мне нужно привязать службу. - person c0dehunter; 09.02.2012
comment
@PrimožKralj Нет, нет, AIDL - это перебор. Все, что вам нужно, это Binder, если вы выполнение некоторого межпроцессного взаимодействия или многопоточности. - person Malcolm; 09.02.2012
comment
Ах, спасибо ;) Еще один короткий вопрос: если я использую bindService(...) в своей деятельности, нормально ли, если я остановлю службу с помощью stopSelf() или я должен также как-то отвязать ее в действии впоследствии? - person c0dehunter; 09.02.2012
comment
@PrimožKralj Нет проблем! stopSelf() абсолютно нормально использовать независимо от того, привязаны вы к своему сервису или нет. На самом деле, если вы используете startService(Intent), требуется даже явная остановка службы. - person Malcolm; 09.02.2012

Правильным синтаксисом будет YourServiceClassName.super.onDestroy(), но, как указывает Малкольм, это не очень хорошая идея.

person Rob Pridham    schedule 09.02.2012