跨进程通信(AndroidStudio上使用AIDL)
2017-07-26 本文已影响81人
IT魔幻师
一、AIDL原理
近日项目中需要用到跨进程通信的技术于是想起了极少用的AIDL,发现以前在eclipse使用aidl 的古老方式居然行不通了,瞎几把折腾了一下之后发现,在androidStudio中使用变得更加方便了,不过也有一些小的变动。
Android接口定义语言
AIDL (Android interface definition language)
android系统中所有的进程都有共同的linux内核空间,通过共享的内存进行通信,aidl就是谷歌封装的进程间通信机制
二、提供远程服务
创建程序一:提供服务
- 创建一个ProvideService使用隐式注册(调用此服务就需要一样的action参数)
<service android:name=".ProvideService">
<intent-filter>
<action android:name="com.hubin.intent.action.FUCK"></action>
</intent-filter>
</service>
-
创建IService.aidl文件接口,(AndroidStudio中创建如下图)
- 在接口中自己定义需要被远程调用的方法
- ProvideService中创建MyBinder对象继承Iservice.Stub,并实现相应的方法,并在onBind中返回MyBinder对象
三、调用远程服务
创建程序二:绑定服务
-
1.将程序一中整个aidl的包 拷贝到main目录下,重新build
-
2.创建MyConnection对象实现ServiceConnection接口,使用IService.Stub.asInterface()将IBinder参数转换为IService对象
private IService mIService; class MyConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { mIService = IService.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { } }
-
3.通过隐式意图绑定服务
/** * 绑定远程服务 * @param view */ public void bindservice(View view) { Intent mIntent = new Intent(); mIntent.setAction("com.hubin.intent.action.FUCK"); mIntent.setPackage("com.hubin.aidldemo");//需要指定提供服务的程序包名 mConn = new MyConnection(); bindService(mIntent, mConn,BIND_AUTO_CREATE); }
-
4.使用mIService调用远程方法,会有异常自己捕获
/** * 执行远程方法 * @param view */ public void mothedStart(View view) { mIService.start(); }