Android AIDL 进行进程间通讯(IPC)
2015-10-12 23:04
381 查看
编写AIDL文件时,需要注意:
1.接口名和aidl文件名相同。
2.接口和方法前不用加访问权限修饰符 (public、private、protected等,也不能用final、static)。
3.AIDL默认支持的类型包括java基本类型 (int、long、boolean等) 和 (String、List、Map、CharSequence),使用这些类型时不需要import声明。对于List和Map中的元素类型必须是AIDL支持的类型,如果使用自定义类型作为参数或者返回值,自定义类型必须实现Parcelable接口。
4.自定义类型和AIDL生成的其它接口类型,在aidl描述文件中,应该显式import,即便在该类和定义的包在同一个包中。
5.在aidl文件中所有非java基本类型参数必须加上in、out、inout标记,以指明参数是输入参数、输出参数还是输入输出参数。
6.Java原始类型默认的标记为in,不能为其它标记。
StudentQuery-aidl文件:(通讯双方共有)
远程服务端:( 为远程服务隐式在清单文件中添加action :com.sample.student.query)
客户端(Activity):
进程间传递自定义类型参数:
1)自定义类型必须实现Parcelable接口,并且实现Parcelable接口的writeToParcel方法:
2)自定义类型中必须含有一个名称为CREATOR的静态成员,该成员对象要求实现Parcelable.Createor接口及其方法。
3)创建一个aidl文件声明你的自定义类型。
Parcelable接口的作用:
实现了Parcelable接口的实例可以将自身的状态信息(状态信息通常指的是各成员变量的值)写入Parcel,也可以从Parcel中恢复其状态,Parcel用来完成数据的序列化传递。
AIDL通讯方式:
在Java中不支持跨进程内存共享的。在JavaEE中,采用RMI通过序列化传递对象。
AIDL是一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码,实现Android设备上的两个进程间通讯(IPC),AIDL的IPC机制和EJB所采用的CORBA很类似,进程间的通信信息,首先会被转换成AIDL协议消息,然后发送给对方,对方收到AIDL协议消息后再转换成响应的对象,由于进程之间的通信信息学需要双向转换,所以android采用代理类在背后实现了信息的双向转换,代理类由android编译器生成。
1.接口名和aidl文件名相同。
2.接口和方法前不用加访问权限修饰符 (public、private、protected等,也不能用final、static)。
3.AIDL默认支持的类型包括java基本类型 (int、long、boolean等) 和 (String、List、Map、CharSequence),使用这些类型时不需要import声明。对于List和Map中的元素类型必须是AIDL支持的类型,如果使用自定义类型作为参数或者返回值,自定义类型必须实现Parcelable接口。
4.自定义类型和AIDL生成的其它接口类型,在aidl描述文件中,应该显式import,即便在该类和定义的包在同一个包中。
5.在aidl文件中所有非java基本类型参数必须加上in、out、inout标记,以指明参数是输入参数、输出参数还是输入输出参数。
6.Java原始类型默认的标记为in,不能为其它标记。
StudentQuery-aidl文件:(通讯双方共有)
//因为是接口描述,所以跟接口类似,AIDL interface StudentQuery{ String queryStudent(int number); // 根据id查询学生名称 }
远程服务端:( 为远程服务隐式在清单文件中添加action :com.sample.student.query)
public class StudentQueryService extends Service { private String[] names = {"张三", "李四" ,"赵武"}; private IBinder binder = new StudentQueryBinder(); @Overrider public IBinder onBind (Intent intent) { return binder; } private final class StudentQueryBinder extends StudentQuery.Stub { public String queryStudent(int number) throws RemoteException { return query(number); } } private String query (int number) { if (number > 0 && number < 4) { return names[number - 1]; } return "没有该学生编号"; } }
客户端(Activity):
public class MainActivity extends Activity { private StudentQuery studentQuery; private StudentConnection conn = new StudentConnection(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView (R.layout.main); Intent service = new Intent ("com.sample.student.query"); bindService (service, conn, BIND_AUTO_CREATE); } // 点击查询 public void queryStudent(View view) { try { studentQuery.queryStudent(0); } catch (RemoteException e) { e.printStackTrace(); } } private final class StudentConnection implements ServiceConnection { public void onServiceConnected (ComponentName name, IBinder service) { // asInterface转换代理对象为接口类型。 studentQuery = StudentQuery.Stub.asInterface(service); } public void onServiceDisconnected (ComponentName name) { studentQuery = null; } } @Override protected void onDestroy() { // 销毁 unbindService(conn); super.onDestroy(); } }
进程间传递自定义类型参数:
1)自定义类型必须实现Parcelable接口,并且实现Parcelable接口的writeToParcel方法:
public void writeToParcel (Parcel dest, int flags)
2)自定义类型中必须含有一个名称为CREATOR的静态成员,该成员对象要求实现Parcelable.Createor接口及其方法。
3)创建一个aidl文件声明你的自定义类型。
Parcelable接口的作用:
实现了Parcelable接口的实例可以将自身的状态信息(状态信息通常指的是各成员变量的值)写入Parcel,也可以从Parcel中恢复其状态,Parcel用来完成数据的序列化传递。
AIDL通讯方式:
在Java中不支持跨进程内存共享的。在JavaEE中,采用RMI通过序列化传递对象。
AIDL是一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码,实现Android设备上的两个进程间通讯(IPC),AIDL的IPC机制和EJB所采用的CORBA很类似,进程间的通信信息,首先会被转换成AIDL协议消息,然后发送给对方,对方收到AIDL协议消息后再转换成响应的对象,由于进程之间的通信信息学需要双向转换,所以android采用代理类在背后实现了信息的双向转换,代理类由android编译器生成。
相关文章推荐
- 关于设置android中EditView控件是否可编辑的相关问题
- AndroidStudio的日常
- Android 学习之Android四大组件(一)——Activity
- Android中解析html网页
- Android adb.exe程序启动不起来,如何处理
- Android学习记事(一)
- android-misc-widgets四向(上下左右)抽屉bug修复版--转载
- Android提高第十九篇之"多方向"抽屉--转
- Android 最火的快速开发框架XUtils
- android画文本
- Android开发RadioButton使用方法
- Android toolbar 随笔
- Android学习手记(6) TabActivity和TabHost
- Android开发随笔(一)
- android开发(一):环境搭建
- Windows下载Android源码
- android 的 Testing Support Library 测试支持包(库)
- Android Touch事件传递机制解析
- android背景选择器selector用法汇总
- android 滚动条