Service方式是两个进程progress之间通讯的方法。通过系统提供的绑定的方式对服务内的方法进行调用,从而实现Service的调用。不是直接调用,使用IBinder接口这种中间件实现的
在Service的继承类中自定义个IBinder的类,该类继承Binder父类即可。此内部类就可当做远程调用的桥梁,因为它是服务类的内部类,因此可以调用服务的任何方法和属性,
更由于在客户端创建bindService(new Intent(this, MyService.class), serviceConn , BIND_AUTO_CREATE);方法的时候需要一个ServiceConnection实例,该实例需要自己实现、
两个方法,onServiceConnected(ComponentName name, IBinder service)和onServiceDisconnected(ComponentName name) 。服务连接成功和断开事件,从而很容易
获得到IBinder的引用实例。具体如下:
在一个Activity调用一个服务的Play方法;
1)在mainActivity中添加两个按钮,一个是服务绑定,一个是服务方法远程调用。
public class MainActivity extends Activity {
private MyBinder binder;
private ServiceConnection serviceConn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder = (MyService.MyBinder)service;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void btnBind(View view){
bindService(new Intent(this, MyService.class), serviceConn , BIND_AUTO_CREATE);
}
public void btnPlay(View v){
binder.play();
}
public void btnStop(View v){
binder.stop();
}
}
//2)创建自定义服务类,使用向导,自动注册:
public class MyService extends Service {
private IBinder binder;
@Override
public void onCreate() {
super.onCreate();
binder = new MyBinder();
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return binder;
}
private void play(){
Toast.makeText(this, "播放", Toast.LENGTH_LONG).show();
}
private void stop(){
Toast.makeText(this, "停止", Toast.LENGTH_LONG).show();
}
class MyBinder extends Binder{
public void play(){
MyService.this.play(); //此处是要调用外部类的方法,使用限定名
}
public void stop(){
MyService.this.stop();
}
}
}