Android: Как остановить музыку c при замене фрагмента? - PullRequest
0 голосов
/ 18 января 2020

Я запускаю аудиофайл во фрагменте, используя следующий код:

public class AudioFragment extends Fragment implements View.OnClickListener {

    private Runnable runnable;
    private Handler handler;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View view= inflater.inflate(R.layout.fragment_audio,container,false);
        btnBwd=view.findViewById(R.id.btnBwd);
        btnPlay=view.findViewById(R.id.btnPlay);
        seekBar=view.findViewById(R.id.seekBar);
        handler=new Handler();

        btnBwd.setOnClickListener(this);
        btnPlay.setOnClickListener(this);

        mediaPlayer = MediaPlayer.create(view.getContext(),R.raw.play);
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){
           @Override
           public void onPrepared(MediaPlayer mediaPlayer){
               seekBar.setMax(mediaPlayer.getDuration());
               mediaPlayer.start();
               changeSeekBar();
           }
        });            
        return view;
    }

    private  void changeSeekBar() {
        seekBar.setProgress(mediaPlayer.getCurrentPosition());
        if(mediaPlayer.isPlaying()){
            runnable = new Runnable() {
                @Override
                public void run() {
                    changeSeekBar();
                }
            };
            handler.postDelayed(runnable,1000);
        }
    }
}

Этот фрагмент создается в другом действии, и когда этот фрагмент заменяется на fragmentTransaction.replace(), музыка c все еще продолжает играть по какой-то причине. Это потому, что был задействован Runnable объект. Могу ли я послать какой-нибудь сигнал процессу?

Какой хороший способ справиться с этим из моей деятельности или самого фрагмента?

Ответы [ 3 ]

2 голосов
/ 18 января 2020

фрагментов и действий имеют жизненный цикл, и в каждом состоянии жизненного цикла есть методы, которые уведомляют вас о текущем жизненном цикле

onAttach () Экземпляр фрагмента связан с экземпляром действия. Фрагмент и действие не полностью инициализированы. Обычно в этом методе вы получаете ссылку на действие, которое использует фрагмент для дальнейшей работы по инициализации.

onCreate () Система вызывает этот метод при создании фрагмента. Вы должны инициализировать основные компоненты фрагмента, которые вы хотите сохранить, когда фрагмент приостановлен или остановлен, а затем возобновлен.

onCreateView () Система вызывает этот обратный вызов, когда пришло время для фрагмента нарисовать свой пользовательский интерфейс в первый раз. Чтобы нарисовать пользовательский интерфейс для вашего фрагмента, вы должны вернуть компонент View из этого метода, который является root макета вашего фрагмента. Вы можете вернуть значение null, если фрагмент не предоставляет пользовательский интерфейс.

onActivityCreated () onActivityCreated () вызывается после метода onCreateView () при создании действия хоста. Создан экземпляр действия и фрагмента, а также иерархия представления действия. На этом этапе к представлению можно обратиться с помощью метода findViewById (). пример. В этом методе вы можете создавать экземпляры объектов, для которых требуется объект Context

onStart () Метод onStart () вызывается, когда фрагмент становится видимым.

onResume () Фрагмент становится активным.

onPause () Система вызывает этот метод как первый признак того, что пользователь покидает фрагмент. Это обычно, где вы должны зафиксировать любые изменения, которые должны быть сохранены после текущего сеанса пользователя.

onStop () Фрагмент будет остановлен вызовом onStop ()

onDestroyView () Представление фрагмента разрушит после вызова этого метода

onDestroy () onDestroy вызывается для окончательной очистки состояния фрагмента, но не гарантированно вызывается Android платформа.

для получения дополнительной информации смотрите здесь: https://www.tutorialspoint.com/android/android_fragments.htm

вы можете получить уведомление, переопределив эти методы и реагируя на них, например в вашем случае, когда вы заменяете или удаляете фрагмент, вызывается метод onPause и onStop (эти два метода различаются), и там вы должны освободить mediaPlayer.

1 голос
/ 18 января 2020

Одним из решений может быть Переопределение Fragment * onPause() и вызов mediaPlayer.pause():

@Override
public void onPause() {
  super.onPause();
  mediaPlayer.pause();
}


Также я предлагаю вам проверить эту тему

1 голос
/ 18 января 2020

Запустите фоновое задание, как musi c, играя в сервисе . из любой точки вашего приложения вы можете запустить или уничтожить службу.

проверьте эту топи c для получения более подробной информации: Android background musi c service

...