Android: остановка медиаплеера при уничтожении активности

У меня есть 2 кнопки, которые воспроизводят звуки, с кодировкой следующим образом:

protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout1);

    buttonSound1 = MediaPlayer.create(Violin.this,R.raw.violin1);
    buttonSound2 = MediaPlayer.create(Violin.this,R.raw.violin2);

...
}

Затем при нажатии кнопки:

button1.setOnClickListener(new OnClickListener()
{
     public void onClick(View view)
     {                                       
         if (b1 %2 == 0)
         {
             button1.setText("STOP!");
             button2.setText("Song 2");
             if(buttonSound1.isPlaying()) buttonSound1.stop();
             if(buttonSound2.isPlaying()) {buttonSound2.stop(); b2++;}                   
             buttonSound1 = MediaPlayer.create(Violin.this,R.raw.violin1);               
             buttonSound1.start();   
         }
         else
         {
             button1.setText("Song 1");
             button2.setText("Song 2");
             if(buttonSound1.isPlaying()) buttonSound1.stop();
             if(buttonSound2.isPlaying()) {buttonSound2.stop(); b2++;}                   
         }
         b1++;   
     }
});

При уничтожении:

@Override  
protected void onDestroy() 
{    

    // stop the sounds
    if(buttonSound1.isPlaying()) buttonSound1.stop(); buttonSound1.release();  
    if(buttonSound2.isPlaying()) buttonSound2.stop(); buttonSound2.release();  

    super.onDestroy();  
} 

Вопрос:

Когда кнопка 1 воспроизводит звук, звук кнопки 2 должен быть остановлен, и наоборот.

Когда я заканчиваю действие (уничтожается), звук все еще воспроизводится до конца без остановки.

Я сомневаюсь, что это связано с тем, что buttonSound1 создается внутри onClickListener и, следовательно, не может быть остановлен при уничтожении? Я пытался удалить такие MediaPlayer.create строк, но затем, когда нажимается кнопка 1, чтобы остановить звук, при повторном нажатии для воспроизведения он просто больше не может воспроизводить звуки.

Как можно изменить вышеизложенное так, чтобы:

  1. кнопка 1 играет, то кнопка 2 должна быть остановлена, и наоборот
  2. Звуки кнопок 1 и 2 будут остановлены сразу после завершения действия.

Спасибо!


person pearmak    schedule 28.12.2013    source источник
comment
какая версия андроида и вы уверены, что onDestroyed() вызывается?   -  person Greg Giacovelli    schedule 28.12.2013
comment
О, я понял, извините, я неправильно понял. Я думал, тебе интересно, почему это не остановилось. Я думаю, вам следует использовать сервис, как говорит @rup35h. Также было бы намного проще использовать один MediaPlayer и отслеживать его, а не по одному для каждой песни.   -  person Greg Giacovelli    schedule 28.12.2013


Ответы (1)


Попробуйте изменить этот код:

@Override
public void onDestroy() {
super.onDestroy();
buttonSound1= MediaPlayer.create(x.this,R.raw.sound);
if(buttonSound1.isPlaying())
{
  buttonSound1.stop();
  buttonSound1.release();
}
}
person rupesh    schedule 28.12.2013
comment
что значит под services? - person pearmak; 28.12.2013
comment
Большое спасибо за вашу подробную информацию, я на самом деле также думаю о добавлении фоновой музыки, и тогда я смогу использовать Services. Тем не менее, здесь, в этом действии, я хотел бы, чтобы звуки останавливались при уничтожении действия... если это так, то как это можно изменить? - person pearmak; 28.12.2013
comment
не забудьте добавить super.onDestroy(); внутри onDestroy(); - person rupesh; 28.12.2013
comment
это работает лучше =) Я хотел бы спросить, активность еще не уничтожена, когда она завершена (намерение и переключение на другую активность для запуска). Я обнаружил, что он все еще играет какое-то время после того, как ушел к другому занятию. Если я поставлю stop() и release() в onBackPressed, вместо этого звуки немедленно прекратятся. - person pearmak; 28.12.2013
comment
developer.android.com/reference/android/app/ - person rupesh; 28.12.2013
comment
Если вы получили то, что искали. Проголосуйте за ответ и примите его. - person rupesh; 28.12.2013
comment
что это за ответ? - person Fernando Torres; 14.04.2020