音频播放器的实现
Service是Android中实现程序后台运行的解决方案,非常适合用于去执行哪些不需要和用户交互而且还要求长期运行的任务。不能运行在一个独立的进程当中,而是依赖与创建服务时所在的应用程序进程。只能在后台运行,并且可以和其他组件进行交互。
Service可以在很多场合使用,比如播放多媒体的时候用户启动了其他Activity,此时要在后台继续播放;比如检测SD卡上文件的变化;比如在后台记录你的地理信息位置的改变等等,总之服务是藏在后台的。
因此音频播放器也是通过Service来实现的。
音频播放器主要依赖MediaPlayer类,通过实现
1 | MediaPlayer.OnCompletionListener, MediaPlayer.OnBufferingUpdateListener, |
这几个接口来对MediaPlayer类的对象进行播放状态的控制。
布局文件设计:
1 | <LinearLayout |
布局效果展示:

1. 接口编程的实现
对于接口IPlayback以及接口内定义的接口Callback,如:
1 | public interface IPlayback { |
在Player类中实现接口IPlayback,包括registerCallback等方法,
1 | private List<Callback> mCallbacks = new ArrayList<>(); |
在Activity、Service中都需要实现IPlayback.Callback接口,
Activity中的实现:
1 | private PlaybackService playbackService; |
在Service中的实现:
1 | private Player mPlayer; |
其中Activity和Service中registerCallback(this),this表示在各自的类中实现Callback接口中的所有方法。
2. 播放器具体实现
定义Player类实现IPlayback接口,在Player类中添加Callback的列表,并对注册入其中的所有Callback调用相应的回调函数。
IPlayback.java:
1 | public interface IPlayback { |
在Player类中pause()、play()、onCompletion()等方法中实现播放状态的转换,在状态转换的方法中实现所有注册的Callback的回调方法。
1 | public class Player implements IPlayback, MediaPlayer.OnCompletionListener, MediaPlayer.OnBufferingUpdateListener, |
自定义PlaybackService类,默认的实现方法包括onCreate()、onStartCommand()、stopService()等,在其中各自实现相应的逻辑。
1 | public class PlaybackService extends Service implements IPlayback, IPlayback.Callback { |
其中remoteViews用来显示通知栏中的播放状态,设置播放的icon等。
AudioDetailActivity类同样注册callback,实现其中的回调方法,同时用bindService的方法和service通信,
1 | public class AudioDetailActivity extends BaseActivity implements DetailContract.View, ObservableScrollViewCallbacks, IPlayback.Callback { |
在播放时seekBar的进度显示通过子线程控制,通过Handler和Runnable来实现。
1 | handleProgress.post(runnable); |