有时候需要给Android应用添加背景音乐的功能,例如一些小游戏之类的应用。在应用处于前台可见时,需要播放背景音乐,当应用处于后台不可见时(如按了home键或进入其它应用或该应用被销毁时)背景音乐也要随之暂停或停止。
利用Service实现背景音乐播放功能
Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可通过绑定到服务与之进行交互,甚至是执行进程间通信 (IPC)。例如,服务可在后台处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序进行交互。
可以通过扩展Service或IntentService来实现服务功能。背景音乐需要在整个应用期间持续播放,停止服务的控制权要交给应用组件,而由于IntentService会在完成任务后自行调用stopSelf()来停止服务,所以不适合此处。这里需要扩展Service来实现功能。
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
/**
* BackgroundMusic
* 后台背景音乐服务(常应用于小游戏),要求
* 1.应用不可见时(未销毁),播放暂停,服务保持
* 2.应用恢复可见时,播放继续(不是重新开始)
* 3.应用退出或被销毁时,服务停止
*/
public class BgmService extends Service {
public static final String APP_TAG = "SUDOKU_TAG";
public static final String ACTION_MUSIC_PLAY= "com.jack..action.ACTION_MUSIC_PLAY";
public static final String ACTION_MUSIC_PAUSE= "com.jack..action.ACTION_MUSIC_PAUSE";
private MediaPlayer mediaPlayer;
private volatile Looper mServiceLooper;
private volatile ServiceHandler mServiceHandler;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
private final class ServiceHandler extends Handler{
private ServiceHandler(Looper looper){
super(looper);
}
//播放 暂停
@Override
public void handleMessage(@NonNull Message msg) {
Intent intent = (Intent) msg.obj;
if (ACTION_MUSIC_PLAY.equals(intent.getAction())) {
i