java 如何从一个碎片摧毁一个媒体播放器?

sycxhyv7  于 2023-02-11  发布在  Java
关注(0)|答案(2)|浏览(104)

我是一个独立开发者,所以我还在学习中。我正在尝试将Fragments用于游戏菜单。在菜单中有一个预览和设置背景音乐的选项。所以在MusicFragment中我有以下代码:

public class MusicFragment extends Fragment {

     Music music = new Music();

     // more code //

     private void previewSong() {
          music.playSong(getActivity(), "Song_1", milliseconds)
     }

     private void stopSong() {
         music.stopPlayer();
     }
}

我有一个单独的类--“Music”为音乐类,代码是这样的:

public class Music extends Activity {

    MediaPlayer player;

    public void playSong(Context context, String songName, int milliseconds) {

            if(player == null) {
                player = MediaPlayer.create(context, R.raw.song1);
                player.seekTo(milliseconds);

                player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                    }
                });

            }

            player.start();
    }

     public void stopPlayer() {

        if(player !=null) {
            player.stop();
            player.reset();
            player.release();
            player = null;
        }
    }

    public String playerStatus() {
        if(player == null) {
            return "player is null";
        } else {
            return "player is NOT null";
        }
    }
}

我可以从片段启动和停止播放器,没有任何问题。我试图解决的是用户预览音乐,然后关闭/最小化应用程序的情况-而不关闭MusicFragment中的音乐(stopPlayer())(音乐仍在播放)。
在这种情况下,应用程序关闭,但音乐仍在播放。我的理解是,片段(在本例中为MusicFragment)没有onPause()。Main_Activity有onPause -但当我通过Main_Activity的onPause()读取MediaPlayer的状态时,它显示playerStatus为“NULL”,即使应用程序关闭时song 1仍在设备上播放。
我试着排除额外的Music类,只在MusicFragment中创建MediaPlayer,但结果是一样的。显然,如果Fragment有一个OnPause,我会从那里调用stopSong()方法。我想我没有理解一个基本概念。任何帮助都将非常感谢。

k0pti3hp

k0pti3hp1#

在这种情况下,您可以利用承载MediaPlayer的Fragment或Activity的onStop方法在应用最小化或关闭时停止播放器。例如,您可以覆盖Main_Activity的onStop方法并在其中添加stopPlayer方法调用:

@Override
protected void onStop() {
    super.onStop();
    music.stopPlayer();
}

这样,当Main_Activity在屏幕上不再可见时,将调用onStop方法并停止音乐。

lmvvr0a8

lmvvr0a82#

您可以将MusicFragment中的stopSong()方法设置为公共。在Activity中创建MusicFragment的示例,然后调用stopSong()方法。

public class MusicFragment extends Fragment {

     Music music = new Music();

     // more code //

     private void previewSong() {
          music.playSong(getActivity(), "Song_1", milliseconds)
     }

     public void stopSong() {
         music.stopPlayer();
     }
}

在您的活动中:

public class MainActivity extends appCompatActivity{
MusicFragment musicFragment;
...

@Override
protected void onPause() {
    super.onStop();
    musicFragment=new MusicFragment();
    musicFragment.stopSong();
}
}

相关问题