Android:更换片段时如何停止音乐?

Posted

技术标签:

【中文标题】Android:更换片段时如何停止音乐?【英文标题】:Android: How to stop music when the fragment is replaced? 【发布时间】:2020-01-18 18:08:02 【问题描述】:

我正在使用以下代码在片段中运行音频文件:

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()时,由于某种原因,音乐仍然会继续播放。是不是因为涉及到Runnable 对象。我可以向进程发送一些信号吗?

从我的活动或片段本身处理这个问题的好方法是什么?

【问题讨论】:

【参考方案1】:

片段和活动都有一个生命周期,在生命周期的每个状态中都有一些方法可以通知您当前的生命周期

onAttach() 片段实例与活动实例相关联。片段和活动未完全初始化。 通常,您会在此方法中获得对活动的引用,该活动 使用片段进行进一步的初始化工作。

onCreate() 系统在创建片段时调用该方法。您应该初始化片段的基本组件 当片段暂停或停止时您想要保留的,然后 已恢复。

onCreateView() 当片段第一次绘制其用户界面时,系统会调用此回调。绘制一个 您的片段的 UI,您必须从这里返回一个视图组件 作为片段布局的根的方法。你可以返回空 如果片段不提供 UI。

onActivityCreated() onActivityCreated() 在创建宿主活动时在 onCreateView() 方法之后调用。活动和 片段实例以及视图层次结构已经创建 活动。此时,可以通过以下方式访问视图 findViewById() 方法。例子。在这种方法中,您可以实例化 需要 Context 对象的对象

onStart() 一旦片段可见,就会调用 onStart() 方法。

onResume()片段变为活动状态。

onPause() 系统调用此方法作为用户离开片段的第一个指示。这通常是您 应该提交任何应该在当前之外持续存在的更改 用户会话。

onStop() 将通过调用 onStop() 停止片段

onDestroyView() Fragment view 调用该方法后会销毁

onDestroy() 调用 onDestroy 对片段状态进行最终清理,但不保证会被 android 调用 平台。

更多信息请看这里:https://www.tutorialspoint.com/android/android_fragments.htm

您可以通过覆盖这些方法来获得通知并对它们做出反应,例如,当您替换或删除片段时 onPause 和 onStop 方法被调用(这两种方法不同)并且您应该在那里释放 MediaPlayer .

【讨论】:

【参考方案2】:

其中一种解决方案可能是覆盖 FragmentonPause() 并调用mediaPlayer.pause()

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



另外我建议你检查这个thread

【讨论】:

【参考方案3】:

运行您的后台任务,例如在service 中播放音乐。您也可以从应用程序的任何位置启动或销毁服务。

查看此主题以获取更多详细信息:Android background music service

【讨论】:

以上是关于Android:更换片段时如何停止音乐?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android 的 mediaplayer 中停止和播放新歌曲?

Android:如何停止这种音乐?

如何从一个片段导航到另一个片段?

Android MediaPlayer 背景音乐线程随机停止

Android Studio - 如何从片段中停止 handler.postDelayed?

android寻呼机滑动标签条片段更换器