博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AIDL小结
阅读量:5014 次
发布时间:2019-06-12

本文共 2543 字,大约阅读时间需要 8 分钟。

AIDL : Android Interface Define Language(接口定义语言)

Service中跨进程间通信利器。。。。

一般都会有Client端和Server端(Server端提供服务)

  实现步骤

  1、在Server模块 main文件夹下新建一个aidl文件夹,创建AIDL文件接口,并在Client中相同位置建立相同的包,相同的AIDL文件

  2、编译之后会在build-generate-source下生成一个aidl文件夹

  3、编写Service

public class IRemoteService extends Service {    @Nullable    @Override    public IBinder onBind(Intent intent) {        return binder;    }    private IBinder binder=new IMyAidlInterface.Stub(){        @Override        public int plus(int a, int b) throws RemoteException {            return a+b;        }    };}

  4、在AndroidManifest文件中注册该Service,并设置Exported属性为true,否则无法被调用

  5、Client中调用 

    Intent i=new Intent();        i.setComponent(new ComponentName("com.alger.lu_yy.myaidl","com.alger.lu_yy.myaidl.IRemoteService"));//包名及类名        bindService(i, new ServiceConnection() {            @Override            public void onServiceConnected(ComponentName name, IBinder service) {                iMyAidlInterface=IMyAidlInterface.Stub.asInterface(service);  //将IBinder转成Aidl接口                try {                  int count= iMyAidlInterface.plus(10,2);                } catch (RemoteException e) {                    e.printStackTrace();                }            }            @Override            public void onServiceDisconnected(ComponentName name) {                iMyAidlInterface=null;            }        },BIND_AUTO_CREATE);

   

注意:发现在Aidl文件中是无法引入相关的类的,能传递的类型有:基本数据类型(short除外),List及Map 这些都是无需Import的,当我们需要传递一些自定义的数据类型时?该如何使用呢?

  1、在java文件夹下建立与aidl文件下相同的包,创建相关的类,并实现Parceable接口

public class Person implements Parcelable {    private  String name;    private  int age;    public Person(String name, int age) {        this.name = name;        this.age = age;    }    protected Person(Parcel in) {       this.age=in.readInt();        this.name=in.readString();    }    public static final Creator
CREATOR = new Creator
() { @Override public Person createFromParcel(Parcel in) { return new Person(in); } @Override public Person[] newArray(int size) { return new Person[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); }}

  2、在aidl文件夹下建立相应的Person.aidl文件,里面写入 

    parcelable Person;(parceleable必须要小写)

  3、并且在Aidl文件中传递自定义的数据类型时必须在类型前面加入in out 关键词

  4、同样在Client模块中相同位置建立相同的类及Aidl文件

 

转载于:https://www.cnblogs.com/lyysz/p/6049798.html

你可能感兴趣的文章
【iOS】UICollectionView自己定义Layout之蜂窝布局
查看>>
golang——(strings包)常用字符串操作函数
查看>>
发布aar到jcenter
查看>>
跨浏览器问题的五种解决方案
查看>>
XPath定位时,使用文本的方法小技巧。
查看>>
安装pandas报错(AttributeError: 'module' object has no attribute 'main')
查看>>
ch02 fundamental definition 01
查看>>
JSON解析
查看>>
Position is everything?(css定位学习的一些心得)(一)
查看>>
如何提高编程水平
查看>>
Jquery Uploadify3.21.与2.1版本 使用中存在的问题--记录三
查看>>
Linux查看进程的内存占用情况 分类: ubuntu ...
查看>>
[BZOJ 2818]Gcd
查看>>
FORM值传递与地址传递
查看>>
(译)yaml快速教程
查看>>
C:大数相加
查看>>
160. Intersection of Two Linked Lists
查看>>
人生苦短,我用python-- Day11
查看>>
JAVA Bean
查看>>
ehcache memcache redis 三大缓存男高音_转
查看>>