Android 尝试使用服务进行暂停/恢复音乐活动

Android 尝试使用服务进行暂停/恢复音乐活动,android,service,Android,Service,我正在尝试创建一个布局中只有一个按钮的活动,当按下按钮时,它将暂停或恢复音乐。问题是,当按下它恢复音乐时,它会重新启动音频文件。你知道如何让它从最后一点开始播放而不是重新开始吗 主要活动 public class MainActivity extends Activity implements OnClickListener { private Boolean isMusicPlaying; @Override protected void onCreate(Bund

我正在尝试创建一个布局中只有一个按钮的活动,当按下按钮时,它将暂停或恢复音乐。问题是,当按下它恢复音乐时,它会重新启动音频文件。你知道如何让它从最后一点开始播放而不是重新开始吗

主要活动

public class MainActivity extends Activity implements OnClickListener {

    private Boolean isMusicPlaying;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        View musicButton = findViewById(R.id.music_button);
        musicButton.setOnClickListener(this);
        startService(new Intent(getBaseContext(), MusicService.class));
        isMusicPlaying = true;
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.music_button)
            if (isMusicPlaying) stopService(new Intent(getBaseContext(),
                    MusicService.class));
            else startService(new Intent(getBaseContext(), MusicService.class));
        isMusicPlaying = !isMusicPlaying;
    }
}
服务等级

public class MusicService extends Service {

    MediaPlayer player;

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    public void onCreate() {
        super.onCreate();
        player = MediaPlayer.create(this, R.raw.song);
        player.setLooping(true); // Set looping
        player.setVolume(100, 100);
    }

    public int onStartCommand(Intent intent, int flags, int startId) {
        player.start();
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        player.pause();
    }
}

停止服务时,服务中的MediaPlayer对象似乎没有保留。 在停止服务之前,您可以使用getCurrentPosition()方法获取歌曲的当前位置

player.pause();
currentPos = player.getCurrentPosition();
并在停止之前将此值发送回“活动”

然后,您可以使用seekTo(int)方法在播放之前移动到指定的时间位置

player.seekTo(currentPos);
player.start();
对于服务和活动之间的通信,您可以注册broadcastreceiver并使用intent或使用

更新: 我发现下面的教程,你最好按照这个。这是关于使用MediaPlayer的服务。 特别是,在初始化MediaPlayer时,根本不使用prepare方法。请写以下几行:

player.setOnPreparedListener(this);
player.prepareAsync();
并添加侦听器:

public void onPrepared(MediaPlayer player) {
    player.start();
}

看到活动已重新启动,为什么不将状态保存到共享首选项中

您是否从服务中获得了正确的当前位置,但它不起作用?当我声明currentPos时,我将其值设为10000,因此音乐将在歌曲播放10秒后开始播放,但它不起作用。每当您停止并重新启动服务时,调用onCreate方法时,请确保将正确的值从服务传递给活动,并在重新启动时将该值设置给mediaplayer。