绑定服务抽取接口
示例代码 简易的播放器:
A. 写一个接口,在接口中写一个要暴露出去的方法
B. 让服务里的内部类实现这个接口
C. 在activity的连接成功后,强转为接口类型
D. 调用接口中的方法,实际上调用的时接口的实现类服务里的内部类里的方法
import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.Binder; import android.os.IBinder; public class MusicService extends Service { private MediaPlayer mediaPlayer; @Override public IBinder onBind(Intent intent) { return new Music(); } private class Music extends Binder implements IMusicService{ @Override public void play() { playMusic(); } @Override public void pause() { pauseMusic(); } @Override public void stop() { stopMusic(); } @Override public void resume() { resumeMusic(); } } public void playMusic(){ //避免音乐二重唱 if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release();//释放音乐 mediaPlayer = null; } //创建音乐对象 mediaPlayer = MediaPlayer.create(this, R.raw.ib); //开启播放 mediaPlayer.start(); } public void stopMusic() { if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.stop(); } } public void resumeMusic() { if (mediaPlayer != null && !mediaPlayer.isPlaying()) { mediaPlayer.start(); } } public void pauseMusic(){ if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.pause(); } }
/** * 音乐服务的接口 * 暴露播放 、暂停、停止、继续播放的功能 */ public interface IMusicService { /** * 播放音乐 */ public void play(); public void pause(); public void stop(); public void resume(); }
import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.view.View; public class MainActivity extends Activity { private Intent intent; private MusicCon mConn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // start开启服务,让服务长期运行在后台 intent = new Intent(this, MusicService.class); startService(intent); // bind绑定服务,调用服务里的方法 mConn = new MusicCon(); bindService(intent, mConn, BIND_AUTO_CREATE); } /** * 播放音乐 */ public void start(View v) { mService.play(); } /** * 暂停音乐 */ public void pause(View v) { mService.pause(); } /** * 停止播放 */ public void stop(View v) { mService.stop(); } /** * 继续播放音乐 */ public void resume(View v) { mService.resume(); } private IMusicService mService; /** * 音乐的连接对象 */ private class MusicCon implements ServiceConnection { @Override public void onServiceDisconnected(ComponentName name) { } @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = (IMusicService) service; } } /** * 在activity销毁前解绑服务 */ @Override protected void onDestroy() { super.onDestroy(); unbindService(mConn); } }
清单文件注册服务: <service android:name="com.example.dugu_music.MusicService" ></service>
最后,关注【码上加油站】微信公众号后,有疑惑有问题想加油的小伙伴可以码上加入社群,让我们一起码上加油吧!!!