1、前面两章我介绍了服务的生命周期和在服务里面注册广播的好处。那么现在我们改学习一下如何进行绑定服务。
2、之所以要进行绑定服务,原因是我们想使用服务里面的方法。比如我们的服务如果是一个音乐服务,音乐服务里面有暂停音乐的播放。那么怎么调这个方法呢??难道是直接new这个Service么???那么不就是直接new 对象调方法么。那我们启动服务。。。。这个原因我忘了。。。。
3、那么如何进行绑定服务呢?需要三个东西,一个是服务、一个调用的界面、一个抽取的接口
特殊介绍:这个抽取的接口是编码习惯抽取出来的,就是你把你这个开启服务的想要调的所有的方法都放在这个接口里面,然后再服务里面去实现,最后再界面里面去调用这些方法。
4、以下是一个微型音乐播放器的绑定服务:
抽取的接口:
public interface Imusic {
public void callPlay();
public void callPause();
public void callResume();
}
服务:
public class MusicService extends Service {
@Override
public IBinder onBind(Intent intent) {
//代理人对象返回
System.out.println("onBind");
return new MyBinder();
}
@Override
public void onCreate() {
super.onCreate();
// 初始播放器
}
public void play() {
System.out.println("音乐响起来了,太好听,你听到了吗");
}
public void pause() {
System.out.println("音乐暂时停下来了,好可惜啊");
}
public void resume() {
System.out.println("音乐又响起来,简直是天籁之音");
}
// 创建代理人对象
class MyBinder extends Binder implements Imusic {
@Override
public void callPlay() {
play();
}
@Override
public void callPause() {
pause();
}
@Override
public void callResume() {
resume();
}
}
}
界面调用:
public class MainActivity extends Activity {
private MyServiceConn conn;
private Imusic imusic;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//当界面创建的时候 就去开启服务 绑定服务
Intent service=new Intent();
service.setClass(this, MusicService.class);
//开启服务
startService(service);
//绑定服务
conn = new MyServiceConn();
bindService(service, conn, BIND_AUTO_CREATE);
}
//播放
public void click(View v){
imusic.callPlay();
}
//暂停
public void click1(View v){
imusic.callPause();
}
//继续播放
public void click2(View v){
imusic.callResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
//当activity销毁的时候
//解除绑定
unbindService(conn);
}
class MyServiceConn implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
imusic = (Imusic) service;
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
}