一、定义

AIDL是用来解决进程间通信的(一般有四种方式:Activity、Service、ContentProvider、Broadcast Receiver),两个进程间无法直接通信,所以要用AIDL(属于前面提到的Service)来借助操作系统底层来间接进行通信,示意图如下:

AIDL全称为 Android Interface Definition Language,即Android接口定义语言。

二、AIDL开发(操作)流程

开发流程一般为:

1、定义AIDL文件(先在服务端定义,客户端也要定义,内容路服务端一样)

2、服务端实现接口

3、客户端调用接口

三、AIDL语法规则

语法规则如下:

1、语法跟Java的接口很相似

2、AIDL只支持方法,不能定义静态成员

3、AIDL运行方法有任何类型的参数(除short外)和返回值

4、除默认类型,均需要导包

四、AIDL支持的数据类型

1、除short外的基本数据类型

2、String, CharSequence

3、List(作为参数时,要指明是输入in 还是输出out), Map

4、Parcelable (自定义类型要实现 Parcelable 接口)

五、AIDL服务端与客户端之间的关系

六、AIDL适用场景

使用了IPC通信,多个客户端,多线程,否则可使用Binder或Messager

七、示例

1、在服务端定义自定义类型Person,实现 Parcelable 接口:

package com.atwal.aidl;

import android.os.Parcel;
import android.os.Parcelable; /**
* Created by Du on 2016/2/25.
*/
public class Person implements Parcelable {
private String name;
private int age; public Person(String name, int age) {
this.name = name;
this.age = age;
} public Person(Parcel source) {
this.name = source.readString();
this.age = source.readInt();
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public int describeContents() {
return 0;
} @Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.name);
dest.writeInt(this.age);
} public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel source) {
return new Person(source);
} @Override
public Person[] newArray(int size) {
return new Person[0];
}
}; @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

2、在服务端定义 Person.aidl :

// IImoocAidl.aidl
package com.atwal.aidl; parcelable Person;

3、在服务端定义 IImoocAidl.aidl :

// IImoocAidl.aidl
package com.atwal.aidl; import com.atwal.aidl.Person; interface IImoocAidl { //计算两个数的和
int add(int num1, int num2); List<String> basicTypes(
byte aByte,
int aInt,
long aLong,
boolean aBoolean,
float aFloat,
double aDouble,
char aChar,
String aString,
in List<String> list); List<Person> addPerson(in Person person);
}

4、在服务端定义Service(注意要在AndroidManifest.xml中定义):

package com.atwal.aidl;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;
import android.util.Log; import java.util.ArrayList;
import java.util.List; /**
* Created by Du on 2016/2/25.
*/
public class IRemoteService extends Service { private ArrayList<Person> persons; /**
* 当客户端绑定到该服务的时候,会执行
*
* @param intent
* @return
*/
@Nullable
@Override
public IBinder onBind(Intent intent) {
persons = new ArrayList<>();
return iBinder;
} private IBinder iBinder = new IImoocAidl.Stub() { @Override
public int add(int num1, int num2) throws RemoteException {
Log.d("TAG", "收到了远程的请求,输入的参数是 " + num1 + " 和 " + num2);
return num1 + num2;
} @Override
public List<String> basicTypes(byte aByte, int aInt, long aLong, boolean aBoolean, float aFloat, double aDouble, char aChar, String aString, List<String> list) throws RemoteException {
return null;
} @Override
public List<Person> addPerson(Person person) throws RemoteException {
persons.add(person);
return persons;
}
};
}

5、在客户端添加Person类,内容和包名都跟服务端一样

6、在客户端添加Person.aidl文件,内容和包名都跟服务端一样

7、在客户端添加IImoocAidl.aidl文件,内客和包名都跟服务端一样

8、客户端调用

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.atwal.aidlclient.MainActivity"> <EditText
android:id="@+id/et_num1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="num1"
android:textSize="20sp" /> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="+"
android:textSize="20sp" /> <EditText
android:id="@+id/et_num2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="num2"
android:textSize="20sp" /> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="="
android:textSize="20sp" /> <TextView
android:id="@+id/tv_result"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> <Button
android:id="@+id/btn_add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="AIDL远程计算" />
</LinearLayout>

代码:

package com.atwal.aidlclient;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView; import com.atwal.aidl.IImoocAidl;
import com.atwal.aidl.Person; import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private EditText mEtNum1, mEtNum2;
private TextView mTvResult;
private Button mBtnAdd; private IImoocAidl iImoocAidl; private ServiceConnection conn = new ServiceConnection() { //绑定上服务的时候
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//拿到了远程的服务代理
iImoocAidl = IImoocAidl.Stub.asInterface(service);
} //断开服务的时候
@Override
public void onServiceDisconnected(ComponentName name) {
//回收资源
iImoocAidl = null;
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initView(); //应用一启动就绑定服务
bindSersvice();
} private void initView() {
mEtNum1 = (EditText) findViewById(R.id.et_num1);
mEtNum2 = (EditText) findViewById(R.id.et_num2);
mTvResult = (TextView) findViewById(R.id.tv_result);
mBtnAdd = (Button) findViewById(R.id.btn_add); mBtnAdd.setOnClickListener(this);
} @Override
public void onClick(View v) {
int num1 = Integer.parseInt(mEtNum1.getText().toString());
int num2 = Integer.parseInt(mEtNum2.getText().toString());
try {
//调用远程的服务
int res = iImoocAidl.add(num1, num2);
mTvResult.setText(String.valueOf(res));
} catch (RemoteException e) {
e.printStackTrace();
mTvResult.setText("错误了");
} try {
List<Person> persons = iImoocAidl.addPerson(new Person("atwal", 21));
Log.d("TAG", persons.toString());
} catch (RemoteException e) {
e.printStackTrace();
}
} private void bindSersvice() {
//获取到服务端
Intent intent = new Intent();
//新版本(5.0以上)必须显示Intent启动绑定服务
intent.setComponent(new ComponentName("com.atwal.aidl", "com.atwal.aidl.IRemoteService"));
bindService(intent, conn, Context.BIND_AUTO_CREATE);
} @Override
protected void onDestroy() {
super.onDestroy();
unbindService(conn);
}
}

整个项目目录结构如下:

android中的AIDL学习笔记的更多相关文章

  1. 我的Android进阶之旅------>Android中编解码学习笔记

    编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...

  2. Android中的Telephony学习笔记(2)

    上一篇文章中学习了android.provider中Telephony类. 这一篇文章学习android.telephony包中的类,这些类是android提供给上层调用的API. 为监測基本电话信息 ...

  3. android中读取通讯录学习笔记

    1.读取通讯录时一次读取时,尽量少读取全部属性.特别是列表展示的时候.会让你的列表载入速度变得难以忍受,建议先载入少量属性.然后在详情的时候载入全部属性. 2.在读取一类属性的时候,建议用一个游标,且 ...

  4. Android(java)学习笔记167:Java中操作文件的类介绍(File + IO流)

    1.File类:对硬盘上的文件和目录进行操作的类.    File类是文件和目录路径名抽象表现形式  构造函数:        1) File(String pathname)       Creat ...

  5. Android(java)学习笔记110:Java中操作文件的类介绍(File + IO流)

    1.File类:对硬盘上的文件和目录进行操作的类.    File类是文件和目录路径名抽象表现形式  构造函数:        1) File(String pathname)       Creat ...

  6. Android(java)学习笔记233: 远程服务的应用场景(移动支付案例)

    一. 移动支付:       用户需要在移动终端提交账号.密码以及金额等数据 到 远端服务器.然后远端服务器匹配这些信息,进行逻辑判断,进而完成交易,返回交易成功或失败的信息给移动终端.用户提交账号. ...

  7. Android(java)学习笔记176: 远程服务的应用场景(移动支付案例)

    一. 移动支付:       用户需要在移动终端提交账号.密码以及金额等数据 到 远端服务器.然后远端服务器匹配这些信息,进行逻辑判断,进而完成交易,返回交易成功或失败的信息给移动终端.用户提交账号. ...

  8. Android自动化测试之Monkeyrunner学习笔记(一)

    Android自动化测试之Monkeyrunner学习笔记(一) 因项目需要,开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括Monkey.Monkeyr ...

  9. Android 中的AIDL,Parcelable和远程服务

    Android 中的AIDL,Parcelable和远程服务      早期在学习期间便接触到AIDL,当时对此的运用也是一撇而过.只到近日在项目中接触到AIDL,才开始仔细深入.AIDL的作用    ...

随机推荐

  1. 课堂笔记-------字符串类型string------练习

    字符串类型 一.string //打出s.时就会出现一堆的方框,要找不带箭头的(不带箭头的是我们现在可以用的到的),不要找带箭头的(带箭头的是扩展,现在还用不到) //不带箭头的都是对s的操作(动作和 ...

  2. Visual Studio 2010 RDLC 报表简单使用

    原文:Visual Studio 2010 RDLC 报表简单使用 RDLC(Report Definition Language Client-side Processing)是Visual Stu ...

  3. 九、IntelliJ IDEA 编译方式介绍及编译器的设置和选择

    相对于 Eclipse 的实时自动编译,IntelliJ IDEA 的编译更加手动化,虽然 IntelliJ IDEA 也可以通过设置开启实时编译,但是太浪费资源了,因此不建议这样做.IntelliJ ...

  4. 【洛谷P3225】[HNOI2012]矿场搭建

    矿场搭建 题目链接 根据题意,发生事故时会有一个挖煤点坍塌, 只有当这个点是割点,会对图的连通性产生影响, 我们首先Tarjan一遍找到所有割点,将原图除去这些割点后, 遍历一遍,找出所有连通块,分三 ...

  5. jquery 跨域获取网页数据

    <script language="javascript" src="http://cbsahhs.blog.163.com/jquery.min.js" ...

  6. 使用dva框架的总结

    最近的项目是react+dva+atd+webpack的一个后台项目,刚接触dva就感觉很喜欢,很简洁用着很爽. 关于使用redux中的一些问题 1.文件切换问题. redux的项目通常哟啊分为red ...

  7. 牛B的swift屏幕旋转经验终结者(OC统一思路)

    牛B的swift屏幕旋转经验终结者(OC统一思路) 1.AppDelegate (1)定义变量 var blockRotation: Bool = false (2)定义方法 Swift代码 func ...

  8. Excel导入功能(Ajaxfileupload)

    前言: 前端采用Easyui+Ajaxfileupload实现 后端采用springmvc框架,其中把解析xml封装成了一个jar包,直接调用即可 准备: 前端需要导入(easyui导入js省略,自行 ...

  9. Spring初始介绍

    一.spring介绍 三层架构中spring位置: spring:对象的容器,相当于map容器,已经存好了相应的对象,而这三层对象(web层,service层,)进行创建时,不需要在进行new对象,s ...

  10. 简单Maven Dos命令语句

    简单Maven Dos命令语句: 打包:mvn package 编译:mvn compile 编译测试程序:mvn test-compile 清空:mvn clean 运行测试:mvn test 生成 ...