采用aidl技术去访问远程服务里面的方法
本地服务:调用者和访问者在同一个进程里面
远程服务:调用者和访问者在不同的进程里面
建立远程服务:
新建一个类继承Service,并在Manifest文件中注册.该类中的方法需要暴露出来才能被其他进程调用
public class MyRemoteService extends Service {
public String sayHelloInRemoteService(String name ){
return "你好:"+name;
}
public class MyBinder extends IService.Stub{
@Override
public String hello(String name) throws RemoteException {
return sayHelloInRemoteService(name);
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return new MyBinder();
}
}
新建一个接口文件,后缀名为aidl,不要public等修饰符.把服务里面的方法都定义到里面.
package cn.itcast.remoteservice;
interface IService {
String hello(String name);
}
编译后会在gen的目录下生成一个与aidl相对应的.java文件
远程引用通过隐式意图来调用该服务.所以该服务要配置隐式意图.
<service android:name=".MyRemoteService">
<intent-filter >
<action android:name="cn.itcast.remoteservice"/>
</intent-filter>
</service>
完了就可以布置到模拟器.
建立本地应用去调用刚刚的服务.
新建一个工程.创建Activity,设置布局文件.
在OnCreate()里面定义个意图.通过隐式意图去调用刚刚的远程服务.
通过bindService方法去启动远程服务.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
et= (EditText) this.findViewById(R.id.et_name);
Intent intent = new Intent();
intent.setAction("cn.itcast.remoteservice");
bindService(intent, new MyConn(), BIND_AUTO_CREATE);
}
public void click(View view){
try {
String name = et.getText().toString();
String message = iservice.hello(name);
Toast.makeText(this, message, 1).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
public class MyConn implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//远程服务里面的代理对象
iservice = IService.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
新定义一个包.包名要和远程服务的报名一致.不能错一个字母.
然后把远程服务里面的aidl文件拷贝到这个包中.在主Activity中完成调用.
先启动远程的服务.然后应用启动本地的应用.