开发步骤:
1、编写 PlayMusicService 组件
重写 Service.onBind 方法,返回给客户端 IBinder 对象,客户端就可以使用该对象动态调用 service 中的某些业务方法
class MusicBinder extends Binder{
声明客户端调用的方法
playMusic()......
}
2、AndroidManifest.xml 中注册该 Service
3、Activity 中的 onCreate 方法中绑定该 Service:
conn = new ServiceConnection(){
onServiceConnect(IBinder binder){
//(MusicBinder)binder.playMusic()
把 binder 对象交给两个 Fragment
}
onServiceDisConnected(){}
}
this.bindService(intent,conn,BIND_AUTO_CREATED)
4、在 Fragment 中接收 binder 对象,然后在合适的时机调用 binder.xx 方法执行业务
我们按照以上开发步骤编写代码:
创建 PlayMusicService
/**
* 播放音乐服务
*/
public class PlayMusicService extends Service {
//Service是单例的,只创建1次,因此在这里创建MediaPlayer,保证只有一个
private MediaPlayer mediaPlayer = new MediaPlayer();
/**
* 当service实例创建时执行
*/
@Override
public void onCreate() {
super.onCreate();
//给mediaPlayer加监听
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
//音乐已经准备好
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.start();
}
});
}
@Override
public IBinder onBind(Intent intent) {
return new MusicBinder();
}
public class MusicBinder extends Binder {
//定义供客户端调用的方法
public void playMusic(String url) {
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(url);
mediaPlayer.prepareAsync();//异步准备
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
AndroidManifest.xml 对 service 进行注册
<service android:name=".service.PlayMusicService" />
Activity 中绑定 Service
public class MainActivity extends FragmentActivity {
......
private ServiceConnection conn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setViews();
//设置ViewPager适配器
setViewPagerAdapter();
//设置监听
setListeners();
//绑定Service
bindMusicService();
}
/**
* 绑定Service
*/
private void bindMusicService() {
Intent intent = new Intent(this, PlayMusicService.class);
conn = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
PlayMusicService.MusicBinder binder = (PlayMusicService.MusicBinder)iBinder;
//把binder对象交给Fragment
NewMusicListFragment f1 = (NewMusicListFragment)fragments.get(0);
f1.setMusicBinder(binder);
}
//绑定成功执行该方法
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
this.bindService(intent,conn, Service.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
this.unbindService(conn);
super.onDestroy();
}
......
}
NewMusicListFragment 中调用 service 中播放音乐方法
/**
* 新歌榜列表
*/
public class NewMusicListFragment extends Fragment {
......
private PlayMusicService.MusicBinder binder;
......
private void setListeners() {
listView.setOnItemClickListener((adapterView, view, i, l) -> {
final MusicItem music = musics.get(i);
String songId = music.id;
Toast.makeText(getActivity(), "position:" + i, Toast.LENGTH_SHORT).show();
//执行业务层 加载这首歌曲的基本信息
model.loadMusicInfoBySongId(songId, new MusicInfoCallback() {
@Override
public void onMusicInfoLoaded(MusicItem musicItem) {
music.url = musicItem.url;
Log.d("TTT", music.url);
//准备通过url地址执行播放业务
//播放音乐
binder.playMusic(music.url);
}
});
});
}
public void setMusicBinder(PlayMusicService.MusicBinder binder){
this.binder = binder;
}
......
}