客户端请求绑定一个服务和得到服务返回值的过程
public class MainActivity extends Activity {
/** Called when the activity is first created. */
private InvokeInterface ii;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
//在主界面一调用客户端的绑定(onBind)方法,就要传一个链接对象给服务端,它就会返回一个
//IBinder给链接对象中的 onServiceConnected用
private ServiceConnection conn=new ServiceConnection() {
//链接丢失或服务被杀死的时候执行的回调函数
@Override
public void onServiceDisconnected(ComponentName name) {
}
//链接上后执行的回调函数
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//aidl技术:服务端生成一个InvokeInterface.aidl文件,客户端拿到这个文件,这个文件起了很重要的作用:
//两者可以通过这个文件互相发送数据:
//当客户端调用自己的aidl对象的业务方法(接口里定义了的)时,给方法传个参数,存到客户端的aidl中
//就可以把参数传到服务端的aidl文件里,服务端拿到这个参数,调用它那边对这个接口的实现类,服务端就把
这个实现类对象的父类传到这里来,也就是service,这时还不能调用业务方法,把这个对象的父类类型
//强转成接口类型,就可以得到一个包含了处理具体业务的对象,用对象调用方法就可以得到结果了
ii = Stub.asInterface(service);
System.out.println("绑定成功,得到IBinder!");
}
};
public void onclick(View view) throws Exception{
Intent intent=new Intent("com.itheima.service.RemoteServeice");
switch (view.getId()) {
case R.id.start:
//利用意图对象按照指定动作开启一个服务
startService(intent);
break;
case R.id.bind:
//绑定一个服务需要的参数:用于打开服务的intent,用来连接上服务的conn,固定参数:自动绑定
bindService(intent, conn,BIND_AUTO_CREATE);
break;
case R.id.invoke:
//ii是回调回来的对象,里面包含了具体处理参数的逻辑方法,调用即可
System.out.println(ii.sayHello("lsk"));
break;
case R.id.unbind:
unbindService(conn) ;
break;
case R.id.stop:
stopService(intent);
break;
}
}
}
服务端如何定义一个服务,并对外提供业务方法处理客户端请求
public class RemoteServeice extends Service {
//自定义的返回类对象,这个对象实现了公用接口,覆盖了接口中的方法,
//该方法若在客户端被传入参数进行调用,则会返回此处外部类对象的业务方法的处理结果
private class MyBinder extends Stub {
@Override
public String sayHello(String name) {
return RemoteServeice.this.sayHello(name);
}
}
public String sayHello(String name){
return "Hello"+name;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
System.out.println("s onCreate");
}
//启动服务和绑定服务没有任何先后顺序之分,是平行的,但创建服务一定是最先的
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
System.out.println("s onStart");
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.out.println("s onDestroy");
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("s onBind");
//返回的是自定义的MyBinder类对象,这个类继承了Stub,而Stub继承了IBinder的子实现类Binder,
//同时Stub也实现了服务和客户端共同的借口,也就是aidl技术处理的那个借口
return new MyBinder();
}
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("s onUnbind");
return super.onUnbind(intent);
}
}
需要使用aidl(Android interface definition language)技术处理的公共接口:
interface InvokeInterface {
String sayHello(String name);
}
如何在清单文件中配置一个服务:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itheima.remotserveice"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<service android:name=".RemoteServeice">
<intent-filter >
使用意图对象开启一个服务时,需要这个动作
<action android:name="com.itheima.service.RemoteServeice"/>
</intent-filter>
</service>
</application>
</manifest>