目录

Android跨进程通信之小例子(一)
Android跨进程通信之非AIDL(二)
Android跨进程通信之Proxy与Stub(三)
Android跨进程通信之AIDL(四)

什么是AIDL

从该系列的几篇文章里,我们知道了Proxy和Stub模式。其实跨进程通信中所谓的AIDL就是帮我们去实现Proxy和Stub模式,帮我们封装好编码译码功能。底层还是transactonTransact方法的调用。

小例子

做一个经典的Echo程序。程序向服务发送一句话,服务给打印出来。

第一步:定义AIDL接口文件(提供Service的APP)

你的服务提供哪些接口去让别人使用,你要先说清楚,但是此时并不需要给出实现。

  • 新建com.example.aidlechoservice.aidl
  • 新建一个普通文件,命名为IEchoService.aidl
package com.example.aidlechoservice.aidl;//这里是当前文件所在包名interface IEchoService{    String echo(String inStr);}

如果使用Eclipse的话,这样定义之后我们会看到产生了gen/com.example.aidlechoservice.aidl/IEchoService.java文件

第二步:实现服务端的Stub(提供Service的APP)

超级简单,就一句话。

IEchoService.Stub mBinder = new IEchoService.Stub() {                        @Override            public String echo(String inStr) throws RemoteException {                return "echo " + inStr + " at " + sdf.format(new Date());            }        };

所以整体代码就这样

public class EchoService extends Service {        private IEchoService.Stub   mBinder;    private SimpleDateFormat    sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        @Override    public void onCreate() {        super.onCreate();        mBinder = new IEchoService.Stub() {                        @Override            public String echo(String inStr) throws RemoteException {                return "echo " + inStr + " at " + sdf.format(new Date());            }        };    }        @Override    public IBinder onBind(Intent intent) {        return mBinder;    }    }

第三步:编写APP的AIDL(调用Service的APP)

跟上面服务的是一模一样,必须是一模一样,否则就不行。

第四步:实现客户端的Proxy(调用Service的APP)

很简单,还是一句话搞定

IEchoService mService = IEchoService.Stub.asInterface(binder);

布局

    

代码

public class MainActivity extends Activity {        private IEchoService        mService;    private ServiceConnection   mServiceConnection;    private Intent              mServiceIntent  = new Intent();        @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mServiceIntent.setComponent(                new ComponentName("com.example.aidlechoservice", "com.example.aidlechoservice.service.EchoService"));        mServiceConnection = new ServiceConnection() {                        @Override            public void onServiceDisconnected(ComponentName name) {                            }                        @Override            public void onServiceConnected(ComponentName name, IBinder binder) {                mService = IEchoService.Stub.asInterface(binder);            }        };    }        public void bind(View v) {        if (isBinded()) {            return;        }        bindService(mServiceIntent, mServiceConnection, Context.BIND_AUTO_CREATE);    }        public void unbind(View v) {        if (!isBinded()) {            return;        }        unbindService(mServiceConnection);    }        public void echo(View v) {        if (!isBinded()) {            return;        }        try {            String result = mService.echo("Hello world!!!");            Log.i("TAG", result);        } catch (RemoteException e) {            e.printStackTrace();        }    }        private boolean isBinded() {        return mService != null;    }}

项目地址

Github地址

更多相关文章

  1. Android工程中R.java文件的重新生成——注意资源文件的错误
  2. Android内核开发:系统分区与镜像文件的烧写
  3. 关于Android 动态加载 jar 文件
  4. pc 与 android webrtc 通信的研究
  5. Android系统编译―Android.mk文件的简单介绍
  6. android 工程中重新生成gen文件夹或R.java 文件
  7. android 手势识别例子
  8. [转载]Android布局文件中命名空间的解析
  9. IPC—进程间通信的基础概念--《Android开发艺术探索》阅读笔记—

随机推荐

  1. Android成长(二)——两个页面交互
  2. Android开发小技巧之------------如何不
  3. Android笔记-自定义适配器
  4. 在android使用OPENGL总结
  5. Timed out Device -- Vibrator
  6. Android ApiDemos示例解析(90):OS->Senso
  7. android异步任务学习笔记
  8. 《深入理解Android(安卓)卷1》读书笔记 (
  9. 第一章 Android体系与系统架构
  10. android:EditText属性/去边框