何为Android中的RPC模式?
相信有的读者还不是很理解,这里和大家做一个简单的介绍.RPC模式:Remote Procedure Call即远程进程调用.
在Android操作系统中,各个组件运行在各自的进程中,它们相互之间是不能访问的.但是在程序之间不可避免的要传递一些对象、参数等,这就需要 实现进程间的相互通信.android采用了一种轻量级的实现方式—>RPC模式来完成进程之间的通信.通过定义接口语言(android interface definition language——AIDL)来完成进程之间相互访问的代码.例如:#1你需要在Activity中访问Service中的某一个方法,就可以采用这种方式来实现了.
AIDL语言是android的一种接口描述语言,编译器可以通过AIDL文件生成一段代码(注意:这段代码是自动生成的),通过预先定义的接口达到两个进程内部通信进程的目的.
详细的说下#1例子是什么个意思:如果需要在一个Activity中访问另一个Service中的某个对象,需要先将对象转化成AIDL可识别的参数(可能是多个参数),然后使用AIDL来传递这些参数,在消息的接收端,使用这些参数封装成自己需要的对象.
总的来说:android中的AIDL RPC是通过接口来实现的,类似Windows中的COM或者Corba,但它是轻量级的,客户端和被调用实现之间是通过代理模式实现的,代理类和被代理类实现同一个Ibinder接口.
接下来我就一个具体的案例和大家讲讲RPC模式的具体实现步骤:
第一步:毫无疑问,是创建AIDL接口文件.第一个问题来了,怎样创建AIDL文件?
其实有这个疑问很正常,我上网搜了一些资料,问题解决.
在当前的Activity所在的Package右击,new一个file,取名BookInfo.aidl.该文件中的具体内容如下:
package com.ceo.remoteservice.activity;
//BookInfo的接口文件
interface BookInfo {
void setName(String name);
void setPrice(float price);
void setPublish(String publish);
//显示book信息
String display();
}
该接口文件中主要包括:当前的package name,接口中的方法的声明.编写完成后ctrl+s,可以发现在gen文件夹下自动生成了BookInfo.java文件.如下图所示:
需要注意的是该文件是系统自动生成的,尽量不要改动里面的代码,以免带来不必要的错误.
第二步:声明一个类public class BookInfoImpl extends BookInfo.Stub
private float price;
private String name,publish;
@Override
public String display() throws RemoteException {
return "书名:" + name + "价格:" + price + "出版社:" + publish;
}
@Override
public void setName(String name) throws RemoteException {
this.name = name;
}
@Override
public void setPrice(float price) throws RemoteException {
this.price = price;
}
@Override
public void setPublish(String publish) throws RemoteException {
this.publish = publish;
}
该文件下实现的这些方法都是在接口文件中定义的.
第三步:向客户端暴露我们的接口,定义一个远程服务的类public class RemoteService extends Service
private Stub bookifo = new BookInfoImpl();
在onBind方法里面直接return bookifo;
第四步:主要就是MainActivity的编写了
01 |
public class MainActivity extends Activity { |
03 |
private BookInfo bookinfo; |
05 |
private Button btnShow; |
07 |
private ServiceConnection conn = new ServiceConnection(){ |
10 |
public synchronized void onServiceConnected(ComponentName name, IBinder service) { |
12 |
bookinfo = BookInfo.Stub.asInterface(service); |
13 |
if (bookinfo != null ) { |
15 |
bookinfo.setName( "android开发之远程服务的调用--jack.li" ); |
16 |
bookinfo.setPrice( 99 .99f); |
17 |
bookinfo.setPublish( "苏州xxx软件有限公司" ); |
18 |
String msg = bookinfo.display(); |
21 |
Toast.makeText(MainActivity. this , msg, 1 ).show(); |
22 |
} catch (RemoteException e) { |
29 |
public void onServiceDisconnected(ComponentName name) { |
36 |
public void onCreate(Bundle savedInstanceState) { |
37 |
super .onCreate(savedInstanceState); |
38 |
setContentView(R.layout.main); |
40 |
btnShow = (Button)findViewById(R.id.btnShow); |
41 |
btnShow.setOnClickListener( new View.OnClickListener() { |
44 |
public void onClick(View v) { |
45 |
Intent intent = new Intent(); |
46 |
intent.setAction( "com.ceo.remoteservice.activity.action.MY_REMOTE_SERVICE" ); |
47 |
bindService(intent, conn, Service.BIND_AUTO_CREATE); |
最后运行结果如图:
至此,所有关于Android中的RPC模式、AIDL接口语言、以及怎样在Activity中访问另一个Service中的对象就全部介绍完毕了.
有需要整个项目源代码的留下邮箱,或直接加我qq,我会发给大家.
2011.10.20.pm
jack.li
QQ:523072842
Email:523072842@qq.com