Git: https://github.com/whtchl/AidlTemplate

AIDL用来做什么

AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写,对于小白来说,AIDL的作用是让你可以在自己的APP里绑定一个其他APP的service,这样你的APP可以和其他APP交互。

AIDL的使用

在android studio 2.0里面使用AIDL,因为是两个APP交互么,所以当然要两个APP啦,我们在第一个工程目录右键

输入名称后,sutido就帮我们创建了一个AIDL文件。

// IMyAidlInterface.aidl
package cc.abto.demo;// Declare any non-default types here with import statementsinterface IMyAidlInterface {/*** Demonstrates some basic types that you can use as parameters* and return values in AIDL.*/void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,double aDouble, String aString);
}

上面就是studio帮我生成的aidl文件。basicTypes这个方法可以无视,看注解知道这个方法只是告诉你在AIDL中你可以使用的基本类型(int, long, boolean, float, double, String),因为这里是要跨进程通讯的,所以不是随便你自己定义的一个类型就可以在AIDL使用的,这些后面会说。我们在AIDL文件中定义一个我们要提供给第二个APP使用的接口。

interface IMyAidlInterface {String getName();
}

定义好之后,就可以sycn project一下,然后新建一个service。在service里面创建一个内部类,继承你刚才创建的AIDL的名称里的Stub类,并实现接口方法,在onBind返回内部类的实例。

public class MyService extends Service
{public MyService(){}@Overridepublic IBinder onBind(Intent intent){return new MyBinder();}class MyBinder extends IMyAidlInterface.Stub{@Overridepublic String getName() throws RemoteException{return "test";}}
}

接下来,将我们的AIDL文件拷贝到第二个项目,然后sycn project一下工程。

这边的包名要跟第一个项目的一样哦,这之后在Activity中绑定服务。

public class MainActivity extends AppCompatActivity
{private IMyAidlInterface iMyAidlInterface;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bindService(new Intent("cc.abto.server"), new ServiceConnection(){@Overridepublic void onServiceConnected(ComponentName name, IBinder service){iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);}@Overridepublic void onServiceDisconnected(ComponentName name){}}, BIND_AUTO_CREATE);}public void onClick(View view){try{Toast.makeText(MainActivity.this, iMyAidlInterface.getName(), Toast.LENGTH_SHORT).show();}catch (RemoteException e){e.printStackTrace();}}
}

这边我们通过隐式意图来绑定service,在onServiceConnected方法中通过IMyAidlInterface.Stub.asInterface(service)获取iMyAidlInterface对象,然后在onClick中调用iMyAidlInterface.getName()。

自定义类型

如果我要在AIDL中使用自定义的类型,要怎么做呢。首先我们的自定义类型要实现Parcelable接口,下面的代码中创建了一个User类并实现Parcelable接口。这边就不对Parcelable进行介绍了,不熟悉的童鞋自行查找资料,总之我们这边可以借助studio的Show Intention Action(也就是Eclipse中的Quick Fix,默认是alt+enter键)帮我们快速实现Parcelable接口。

接下新建一个aidl文件,名称为我们自定义类型的名称,这边是User.aidl。在User.aidl申明我们的自定义类型和它的完整包名,注意这边parcelable是小写的,不是Parcelable接口,一个自定类型需要一个这样同名的AIDL文件。

package cc.abto.demo;
parcelable User;

然后再在我们的AIDL接口中导入我们的AIDL类型。

然后定义接口方法,sycn project后就可以在service中做具体实现了。

public class MyService extends Service
{//...@Overridepublic IBinder onBind(Intent intent){return new MyBinder();}class MyBinder extends IMyAidlInterface.Stub{//...@Overridepublic User getUserName() throws RemoteException{return new User("wswf");}}
}

最后将我们的AIDL文件和自定义类型的java一并拷贝到第二个项目,注意包名都要一样哦

然后就可以在Activity中使用该自定义类型的AIDL接口了

public class MainActivity extends AppCompatActivity
{//...public void onClick(View view){try{Toast.makeText(MainActivity.this, iMyAidlInterface.getUserName().getName(), Toast.LENGTH_SHORT).show();}catch (RemoteException e){e.printStackTrace();}}
}

效果图就不贴了哈,通过这种方式我们就可以让两个APP之间进行交互了。

Android中AIDL的使用详解相关推荐

  1. android studio parcelable,Android中Parcelable的使用详解

    Parcelable与Serializable Serializable是Java为我们提供的一个标准化的序列化接口. Parcelable是Android为我们提供的序列化的接口. 对比: 1.Pa ...

  2. Android中的四大组件详解

    Android中的四大组件详解 我们都知道Android系统应用层框架中,为开发者提供了四大组件来便于应用的开发,它们是Activity.Service.BroadcastReceiver.Conte ...

  3. RxJava操作符在android中的使用场景详解(一)

    转载请注明出处:http://www.wangxinarhat.com/2016/04/19/2016-04-19-rxjava-android-operate1/ 最近学习了RxJava在andro ...

  4. Android中图片压缩方案详解

    如感觉排版不舒服,可移步至此处查看 图片的展示可以说在我们任何一个应用中都避免不了,可是大量的图片就会出现很多的问题,比如加载大图片或者多图时的OOM问题,可以移步到Android高效加载大图.多图避 ...

  5. Android中LayoutParams类精炼详解

    一.前期基础知识储备 首先看几个使用LayoutParams的实例: 1.<Android开发艺术探索>第8章,Java代码中动态设置按钮时 通过LayoutParams参数设置按钮位置x ...

  6. Android中R.java文件详解

    R.java文件有两种,两种文件作用一样都是获取资源的引用,区别在于一个存放着我们写的项目中资源的引用,另一个存放着系统定义好的一些资源 1.1 项目的R.java文件 先说第一种是项目编译出来的R. ...

  7. Android中Service的使用详解和注意点(LocalService)

    开始,先稍稍讲一点android中Service的概念和用途吧~ Service分为本地服务(LocalService)和远程服务(RemoteService): 1.本地服务依附在主进程上而不是独立 ...

  8. Android 中ContentProvider和Uri详解

    一.使用ContentProvider(内容提供者)共享数据 ContentProvider在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给 ...

  9. android token机制_对Android 中的 ANR 进行详解

    前言 关于ANR,以前只知道Activity.BroadCastReceiver.Service三种组件的ANR时限.一般采用哪些方式避免ANR.以及通过data/anr/traces.txt去分析A ...

最新文章

  1. windows下安装Python virtualenvwrapper-win
  2. java.lang.UnsatisfiedLinkError解决方法汇集
  3. flash动画设计期末作业_「2019年下学期」第二十五二十六节:期末作品三-吉祥物设计...
  4. 上海电力大学c语言程序设计章测试,上海电力学院c语言报告:实验8 指针.doc
  5. dubbo 支持服务降级吗_关于dubbo的服务降级
  6. 一步步实现 Redis 搜索引擎 1
  7. python whl文件下载地址
  8. js字符串分割处理的几种方法
  9. Python -- 使用if语句处理列表
  10. 颜色和移动物体识别系统
  11. 在centos7下安装云锁
  12. 华为生成很多html文件,原来只要按下华为手机这个键,100页纸质文件就能立马扫描成PDF...
  13. 正版免费图片编辑处理软件下载_图片处理软件
  14. 飘雪的夜晚,在那短短的几分钟内,她是我的,然而转过那条街,我们各奔东西
  15. python实现批量识别图片文字,生成对应的txt文件
  16. 爽啊!写了一个网页:首字母索引的单词(十分垃圾,简单的不得了)
  17. HW-蓝队工作流程(1)
  18. python中pivot table 透视表实例
  19. 精英反向学习与二次插值改进的黏菌优化算法ISMA(学习笔记_13)
  20. html制作日历备忘录,vue实现日历备忘录功能

热门文章

  1. android浮动文本,android – 如何将文本添加到浮动操作按钮?
  2. 开闭操作进行平滑处理与边缘提取
  3. python星号正方形_Python星号*与**用法分析
  4. 报告称中国出境游客移动支付消费首次超现金
  5. hihocoder1513 小Hi的烦恼
  6. 手摸手,带你用 vue 动画实现原生 app 切换效果,丝滑般的体验
  7. 错误处理:java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addFilter
  8. Angular 4.x Events Bubbling
  9. Java RESTful Web Service实战
  10. apache-shiro杂记(三) 用了apache-shiro后,HttpSession.getServletContext() API无法正常工作了...