何为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;    @Overridepublic String display() throws RemoteException {    return "书名:" + name + "价格:" + price + "出版社:" + publish;}    @Overridepublic void setName(String name) throws RemoteException {    this.name = name;}    @Overridepublic void setPrice(float price) throws RemoteException {    this.price = price;}    @Overridepublic void setPublish(String publish) throws RemoteException {    this.publish = publish;}

该文件下实现的这些方法都是在接口文件中定义的.

第三步:向客户端暴露我们的接口,定义一个远程服务的类public class RemoteService extends Service

private Stub bookifo = new BookInfoImpl();

在onBind方法里面直接return bookifo;

第四步:主要就是MainActivity的编写了

public class MainActivity extends Activity {    //声明接口    private BookInfo bookinfo;    //声明Button    private Button btnShow;    //最重要的一点就是----->实例化ServiceConnection    private ServiceConnection conn = new ServiceConnection(){                 @Override        public synchronized void onServiceConnected(ComponentName name, IBinder service) {            //--->获得BookInfo的接口            bookinfo = BookInfo.Stub.asInterface(service);            if(bookinfo != null) {                try {                    bookinfo.setName("android开发之远程服务的调用--jack.li");                    bookinfo.setPrice(99.99f);                    bookinfo.setPublish("苏州xxx软件有限公司");                    String msg = bookinfo.display();                                         //Toast显示                    Toast.makeText(MainActivity.this, msg, 1).show();                } catch (RemoteException e) {                    e.printStackTrace();                }            }        }         @Override        public void onServiceDisconnected(ComponentName name) {                     }             };         @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                 btnShow = (Button)findViewById(R.id.btnShow);        btnShow.setOnClickListener(new View.OnClickListener() {                         @Override            public void onClick(View v) {                Intent intent = new Intent();                intent.setAction("com.ceo.remoteservice.activity.action.MY_REMOTE_SERVICE");                bindService(intent, conn, Service.BIND_AUTO_CREATE);            }        });    }}


最后运行结果如图:

至此,所有关于Android中的RPC模式、AIDL接口语言、以及怎样在Activity中访问另一个Service中的对象就全部介绍完毕了.

更多相关文章

  1. Android 应用进程保活APP常驻内存研究方案
  2. 非root下,如何将android中的数据库文件存放到外部存储并导出
  3. android 将app添加进入文件的打开方式
  4. android:scaleType="matrix"布局文件加载图片时候的显示方式
  5. Android读取sql文件并导入数据库
  6. Android音频处理——通过AudioRecord去保存PCM文件进行录制,播放,
  7. Android的XML布局文件中layout_width和width的区别
  8. Android进程间通信(IPC)机制Binder简要介绍和学习计划
  9. 第三部分:Android 应用程序接口指南---第二节:UI---第五章 设置(Set

随机推荐

  1. 20个基础函数的练习
  2. 换个角度看硅谷的前世今生三部曲之3- 展
  3. 印度硅谷?少来了,硅谷不是你想叫,想叫就能
  4. 面向目标 vs. 面向功能: 选择正确的Produ
  5. 三分钟带你读懂硅谷的过去、现在、和未来
  6. 海外最新的垂直市场水平化攻略
  7. 创新大师Steve Blank: 你真的知道什么是
  8. 公司拿钱要3P|其实,一开始我是拒绝的...
  9. 一场VC和PE的博弈
  10. 天欲亡我,非战之罪!怪吾创业前未阅《三国》