AIDL

先来两个传送门:

http://www.cnblogs.com/yydcdut/p/3961545.html Android面试,与Service交互方式

http://www.cnblogs.com/yydcdut/p/3810816.html Android -- Service绑定解绑和aidl

Android Studio AIDL

  • 建立AIDL,通过点击建立AIDL文件:

  • 建立好之后就出现了AIDL文件:

  • Build-->Make Project,生成相应的java文件。

  • 先看看aidl文件

// ICameraData.aidl
package com.yydcdut.cameramvc; // Declare any non-default types here with import statements interface ICameraData {
void add(String fileName,int size, long time);
}

生成的aidl文件:

/*
* This file is auto-generated. DO NOT MODIFY.
* Original file: /Users/yuyidong/AndroidStudioProjects/Camera-Camera2-MVC/app/src/main/aidl/com/yydcdut/cameramvc/ICameraData.aidl
*/
package com.yydcdut.cameramvc;
// Declare any non-default types here with import statements public interface ICameraData extends android.os.IInterface {
/**
* Local-side IPC implementation stub class.
*/
public static abstract class Stub extends android.os.Binder implements com.yydcdut.cameramvc.ICameraData {
private static final java.lang.String DESCRIPTOR = "com.yydcdut.cameramvc.ICameraData"; /**
* Construct the stub at attach it to the interface.
*/
public Stub() {
this.attachInterface(this, DESCRIPTOR);
} /**
* Cast an IBinder object into an com.yydcdut.cameramvc.ICameraData interface,
* generating a proxy if needed.
*/
public static com.yydcdut.cameramvc.ICameraData asInterface(android.os.IBinder obj) {
if ((obj == null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);//根据包名获取本地实现的一个接口的实例,如果是本地service则可以获取到
if (((iin != null) && (iin instanceof com.yydcdut.cameramvc.ICameraData))) {
return ((com.yydcdut.cameramvc.ICameraData) iin);////如果得到的实例是ICameraData的对象,则返回
}
return new com.yydcdut.cameramvc.ICameraData.Stub.Proxy(obj);//如果无法得到本地实现的对象则会返回一个代理对象
} @Override
public android.os.IBinder asBinder() {
return this;
} @Override
public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {
switch (code) {
case INTERFACE_TRANSACTION: {
reply.writeString(DESCRIPTOR);
return true;
}
case TRANSACTION_add: {
data.enforceInterface(DESCRIPTOR);
java.lang.String _arg0;
_arg0 = data.readString();//读取fileName
int _arg1;
_arg1 = data.readInt();//读取size
long _arg2;
_arg2 = data.readLong();//读取time
this.add(_arg0, _arg1, _arg2);
reply.writeNoException();
return true;
}
}
return super.onTransact(code, data, reply, flags);
} private static class Proxy implements com.yydcdut.cameramvc.ICameraData {
private android.os.IBinder mRemote; Proxy(android.os.IBinder remote) {
mRemote = remote;
} @Override
public android.os.IBinder asBinder() {
return mRemote;
} public java.lang.String getInterfaceDescriptor() {
return DESCRIPTOR;
} @Override
public void add(java.lang.String fileName, int size, long time) throws android.os.RemoteException {
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeString(fileName);//写入
_data.writeInt(size);//写入
_data.writeLong(time);//写入
mRemote.transact(Stub.TRANSACTION_add, _data, _reply, 0);//调用binderDriver的提供的方法将参数发给服务端
_reply.readException();
} finally {
_reply.recycle();
_data.recycle();
}
}
} static final int TRANSACTION_add = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
} public void add(java.lang.String fileName, int size, long time) throws android.os.RemoteException;
}

代理中也实现了ICameraData接口定义的方法,我们以add方法为例,里面将参数打包发送给Server端。在Server端收到请求后,会调用service中我们实现的那个stub对象(mBinder)的onTransact方法。

如何在Studio中使用

  • 在Service中:
    ICameraData.Stub mStub = new ICameraData.Stub() {
@Override
public void add(String fileName, int size, long time) throws RemoteException {
//.............
}; @Override
public IBinder onBind(Intent intent) {
return mStub;
}
  • 在Activity中绑定Service:
private ServiceConnection mServiceConnection = new ServiceConnection() {

        @Override
public void onServiceConnected(ComponentName name, IBinder service) {
mCameraService = ICameraData.Stub.asInterface(service);
mIsBind = true;
} @Override
public void onServiceDisconnected(ComponentName name) {
mCameraService = null;
mIsBind = false;
}
};
  • 调用Service的方法:
mCameraService.add(fileName, size, time);

在Manifest中申明

<service
android:name=".CameraService"
android:process=":remote"></service>

注意

android.os.TransactionTooLargeException

在Android中,进程间通信通过binder实现,bind是通信的数据载体,当序列化后的数据单元过大时,就会出问题,报出android.os.TransactionTooLargeException。官方文档里有说明,最大通常限制为1M.也就是说如果大于1M数据的话,就应该分开传。理论上说,应该都是对象和字符串类型的数据为主,只要不是大图片实体等问题,一般应该够用。

我是天王盖地虎的分割线

Android Studio中实现AIDL的更多相关文章

  1. Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用

    在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法.可是我们能发现Messenger是以串行的方式来处理client ...

  2. Android studio 中创建AIDL Service

      1.概述  AIDL在android系统中的作用 AIDL,Android Interface definition language的缩写,它是一种android内部进程通信接口的描写叙述语言, ...

  3. 大仙说道之Android studio实现Service AIDL

    今天要开发过程中要用到AIDL的调用,之前用的eclipse有大量教程,用起来很方便,现在刚换了Android studio,不可否认studio真的很强大,只是很多功能还需要摸索. AIDL(And ...

  4. Android Studio实现Service AIDL

    Android Studio实现Service AIDL [日期:2015-01-02] 来源:Linux社区  作者:teenyboy [字体:大 中 小]       今天要开发过程中要用到AID ...

  5. android studio 中移除module和恢复module

    一.移除Android Studio中module 在Android Studio中想要删除某个module时,在Android Studio中选中module,右键发现没有delete,如图: An ...

  6. Android Studio中Button等控件的Text中字符串默认大写的解决方法

    初学Android的时候,在Android Studio中xml里面添加一个Button.EditText等控件后,它的Text总是会显示大写,即使你输入的字符串是小写也不行,控制字符串大小写的属性是 ...

  7. .Net程序员之不学Java做安卓开发:Android Studio中的即时调试窗口

    对学.Net的人来说,JAVA开发是一场噩梦. .net中的即时窗口,调试时直接在里面写代码,对程序中的各种方法/属性进行调用,很方便. Android Studio中找了好久,参考如下网址,也有类似 ...

  8. 如何将Eclipse中的项目迁移到Android Studio 中

    如何将Eclipse中的项目迁移到Android Studio 中 如果你之前有用Eclipse做过安卓开发,现在想要把Eclipse中的项目导入到Android Studio的环境中,那么首先要做的 ...

  9. Android开发的小技巧,在Android Studio中使用Designtime Layout Attributes

    在编写xml文件时,为了预览效果,经常会使用默认填上一些内容,比如TextView时,随便写上一个text <TextView ... android:text="Name:" ...

随机推荐

  1. BZOJ4205 : 卡牌配对

    对于两张卡牌,如果存在两种属性值不互质,则可以匹配. 只考虑200以内的质数,一共有46个,可以新建3*46*46个点来表示一类属性值中有这两种质数的卡牌. 然后对于每张卡牌,枚举它的质因子,最多只有 ...

  2. 19. 删除链表的倒数第N个节点

    19. 删除链表的倒数第N个节点 题意 删除链表的倒数第N个结点 解题思路 先让快结点移动n个位置,接着再让慢结点和快结点同时移动,发现出慢结点就是要删除的结点,将前结点指向删除结点的下一个结点即可: ...

  3. Django-Filter源码解析一

    Django Filter源码解析 最近在看Django-FIlter项目的源码,学习一下别人的开发思想: 整体介绍 首先,我从其中一个测试用例作为入口,开始了debug之路,一点一点的断点,分析它的 ...

  4. MikroTik RouterOS安装chr授权到阿里云虚拟机(转)

    CHR介绍 CHR(Cloud Hosted Router) 是用于在虚拟机上运行的 RouterOS 版本,它支持x86_64架构,支持大多数流行的虚拟化技术,如 VMWare, Hyper-V, ...

  5. CentOS 7开机不执行/etc/rc.local的解决方法

    该死的CentOS 7居然开机不执行/etc/rc.local!!!!! 解决: chmod +x /etc/rc.d/rc.local 问题分析: 其实在/etc/rc.lacal文件上已经说明了, ...

  6. 用AB对Webservice做压力测试

    AB工具下载 AB工具介绍见 web压力测试工具 下载ab工具后放到任意目录下,从命令行打开ab.exe 使用以下命令测试Webservice ab -c 100 -n 1000 -p zip.txt ...

  7. ChibiOS/RT 2.6.9 CAN Low Level Driver for STM32

    /* ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio Licensed under the Apache License, Version 2 ...

  8. Android如何运行真机在eclipse上调试应用?

    主要通过以下几个步骤: 1.手机通过数据线连接在电脑上 2.设置android手机为USB调试模式.步骤: menu—> 设置 —> 应用程序 —> 开发 , 选择[USB调试] 3 ...

  9. CListCtrlEx:一个支持文件拖放和实时监视的列表控件——用未公开API函数实现Shell实时监视

    一.需求无论何时,当你在Explorer窗口中创建.删除或重命名一个文件夹/文件,或者插入拔除移动存储器时,Windows总是能非常快速地更新它所有的视图.有时候我们的程序中也需要这样的功能,以便当用 ...

  10. mormot支持https

    mormot支持https 将ssl证书导入电脑系统,以Windows 10为例: 运行 mmc 证书导入成功后,双击证书,查看证书指纹: 第二项工作:将证书与https绑定:以管理员身份启动cmd, ...