本文将深入解析Android音频播放器Service的核心实现,重点探讨播放控制、状态管理和数据交互等关键环节,帮助开发者理解在线音频播放的后台运行机制。
播放服务的基础权限配置
1、服务核心变量定义
private static AudioPlayerManager apm; //音频播放管理
private static int mPosSomeTime = 0;// 播放指针 单元
private String jsonList, unit_name; //歌曲列表数据 歌曲名称
private static int bookId; //内层专辑ID
private static String book_name; //内层专辑ID
private static long process = 0; //当前歌曲播放进度
private static long max = 0; //当前歌曲最大进度
private static ExecutorService fixedThreadPool;
private static int isFrom; //来源 0 专辑列表 1首页 2 AI问答
private String book_cover; //专辑封面
private static int bizId; //外层专辑ID
private static String bizTopic; //外层专辑主题
private static long timeStart = 0; //开始计时的时间戳
private static boolean countDowning = false; //是否倒计时中
2、服务初始化流程
@Override
public void onCreate() {
super.onCreate();
EventBus.getDefault().register(this);
fixedThreadPool = Executors.newFixedThreadPool(3);
apm = AudioPlayerManager.getInstance(TbjcPlayerService.this); Player.Listener listener = new Player.Listener() {
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
switch (playbackState) {
case Player.STATE_BUFFERING://加载缓存且还未准备好时触发 break;
case Player.STATE_READY: //播放准备
timeStart = System.currentTimeMillis(); //记录播放开始时间
break;
case Player.STATE_ENDED: //播放结束时触发
process=0;
fixedThreadPool.execute(command4); //保存播放进度
int sum = 0;
sum = ConstantFd.unit_List.size(); //专辑中的歌曲数量
if(ConstantFd.loop_type == 2 && sum > 0){ //随机播放
int index = (int) (Math. random() * sum-1);
to_play(index);
}else if(ConstantFd.loop_type == 0){ //顺序播放
Log.e("TAG", "mPosSomeTime---> "+mPosSomeTime);
if(mPosSomeTime < sum - 1){//播放指针 小于 列表总数
play_next(1); //播放下一个
}else { //已播完最后一首 暂停操作
ConstantFd.isplay = false;
apm.playOrPause(false);
PlayStateMsg.sendState(false); //发送播放状态 通知ui
}
}else if(ConstantFd.loop_type == 1){ //