android aidl工具,【Android】AIDL介绍和实例讲解

4b5bd3de9c8a78f074baaa727044a136.png

前言

为使应用程序之间能够彼此通信,Android提供了IPC (Inter Process Communication,进程间通信)的一种独特实现: AIDL (Android Interface Definition Language, Android接口定义语言)。

网上看了几篇关于AIDL的文章,写得都很不错,不过例子构造大多略微复杂: 建立两个Android项目,一个是client,一个是server(提供service)。

这篇文章将通过一个项目来介绍AIDL用法,包含了service和client。可能简单了些,不过轻省许多。

这篇博文包含以下三个部分:

1、AIDL介绍

2、定义

3、用例: HelloSumAIDL

3.1、创建工程

3.2、定义AIDL文件

3.3、实现远程服务(Service)

3.4、“暴露”服务

3.5、相关代码

一、 AIDL介绍

在Android中,每个应用(Application)执行在它自己的进程中,无法直接调用到其他应用的资源,这也符合“沙箱”的理念。所谓沙箱原理,一般来说用在移动电话业务中,简单地说旨在部分地或全部地隔离应用程序。关于沙箱技术我们这里就不多做介绍了,可以参看51CTO的这篇文章。

因此,在Android中,当一个应用被执行时,一些操作是被限制的,比如访问内存,访问传感器,等等。这样做可以最大化地保护系统,免得应用程序“为所欲为”。

那我们有时需要在应用间交互,怎么办呢?于是,Android需要实现IPC协议。然而,这个协议还是有点复杂,主要因为需要实现数据管理系统(在进程或线程间传递数据)。为了暂时减缓这个“会呼吸的痛”,Android为我们实现了自己的IPC,也就是梁静茹,oh,sorry,是AIDL :]

二、 定义

AIDL是IPC的一个轻量级实现,用了对于Java开发者来说很熟悉的语法。Android也提供了一个工具,可以自动创建Stub(类构架,类骨架)。当我们需要在应用间通信时,我们需要按以下几步走:

1. 定义一个AIDL接口

2. 为远程服务(Service)实现对应Stub

3. 将服务“暴露”给客户程序使用

三、 用例: HelloSumAIDL

AIDL的语法很类似Java的接口(Interface),只需要定义方法的签名。

AIDL支持的数据类型与Java接口支持的数据类型有些不同

1. 所有基础类型(int, char, 等)

2. String,List,Map,CharSequence等类

3. 其他AIDL接口类型

4. 所有Parcelable的类

为了更好地展示AIDL的用法,我们来看一个很简单的例子: 两数相加。

3.1创建工程

事不宜迟,我们就创建一个Android项目。以下是项目的基本信息(不一定要一样):

- 项目名称: HelloSumAIDL

- 目标平台: 4.3

- 包名: com.android.hellosumaidl

- Activity名称: HelloSumAidlActivity

3.2创建工程

在com.android.hellosumaidl这个包中,新建一个普通文件(New->File),取名为 IAdditionService.aidl。在这个文件中输入以下代码:

package com.android.hellosumaidl;

// Interface declaration

interface IAdditionService {

// You can pass the value of in, out or inout

// The primitive types (int, boolean, etc) are only passed by in

int add(in int value1, in int value2);

}

一旦文件被保存,Android的AIDL工具会在gen/com/android/hellosumaidl这个文件夹里自动生成对应的IAdditionService.java这个文件。因为是自动生成的,所以无需改动。这个文件里就包含了Stub,我们接下来要为我们的远程服务实现这个Stub。

3.3实现远程服务

首先我们在com.android.hellosumaidl这个包中新建一个类,取名叫AdditionService.java。为了实现我们的服务,我们需要让这个类中的onBind方法返回一个IBinder类的对象。这个IBinder类的对象就代表了远程服务的实现。为了实现这个服务,我们要用到自动生成的子类IAdditionService.Stub。在其中,我们也必须实现我们之前在AIDL文件中定义的add()函数。下面是我们远程服务的代码:

package com.android.hellosumaidl;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.os.RemoteException;

/*

* This class exposes the service to client

*/

public class AdditionService extends Service {

@Override

public void onCreate() {

super.onCreate();

}

@Override

public IBinder onBind(Intent intent) {

return new IAdditionService.Stub() {

/*

* Implement com.android.hellosumaidl.IAdditionService.add(int, int)

*/

@Override

public int add(int value1, int value2) throws RemoteException             {

return value1 + value2;

}

};

}

@Override

public void onDestroy() {

super.onDestroy();

}

}

3.4“暴露”服务

一旦实现了服务中的onBind方法,我们就可以把客户程序(在这里是HelloSumAidlActivity.java)与服务连接起来了。为了建立这样的一个链接,我们需要实现ServiceConnection类。我们在HelloSumAidlActivity.java创建一个内部类AdditionServiceConnection,这个类继承ServiceConnection类,并且重写了它的两个方法:onServiceConnected和onServiceDisconnected。下面给出内部类的代码:

/*

* This inner class is used to connect to the service

*/

class AdditionServiceConnection implements ServiceConnection {

public void onServiceConnected(ComponentName name, IBinder boundService) {

service = IAdditionService.Stub.asInterface((IBinder)boundService);

Toast.makeText(HelloSumAidlActivity.this, "Service connected", Toast.LENGTH_LONG).show();

}

public void onServiceDisconnected(ComponentName name) {

service = null;

Toast.makeText(HelloSumAidlActivity.this, "Service disconnected", Toast.LENGTH_LONG).show();

}

}

这个方法接收一个远程服务的实现作为参数。这个实现随后被转换(cast)为我们自己的AIDL的实现。我们使用 IAdditionService.Stub.asInterface((IBinder)boundService)。

3.5相关代码

为了完成我们的测试项目,我们需要首先改写main.xml(主界面的格局文件)和string.xml(字符串定义文件):

main.xml

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello"

android:textSize="22sp" />

android:id="@+id/value1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:hint="@string/hint1" >

android:id="@+id/TextView01"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/plus"

android:textSize="36sp" />

android:id="@+id/value2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:hint="@string/hint2" >

android:id="@+id/buttonCalc"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:hint="@string/equal" >

android:id="@+id/result"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/result"

android:textSize="36sp" />

string.xml

HelloSumAIDL

Hello Sum AIDL

Result

+

=

Value 1

Value 2

最后,我们的HelloSumAidlActivity.java如下:

package com.android.hellosumaidl;

import android.os.Bundle;

import android.os.IBinder;

import android.os.RemoteException;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;

import android.app.Activity;

import android.content.ComponentName;

import android.content.Context;

import android.content.Intent;

import android.content.ServiceConnection;

public class HelloSumAidlActivity extends Activity {

IAdditionService service;

AdditionServiceConnection connection;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

initService();

Button buttonCalc = (Button)findViewById(R.id.buttonCalc);

buttonCalc.setOnClickListener(new OnClickListener() {

TextView result = (TextView)findViewById(R.id.result);

EditText value1 = (EditText)findViewById(R.id.value1);

EditText value2 = (EditText)findViewById(R.id.value2);

@Override

public void onClick(View v) {

int v1, v2, res = -1;

v1 = Integer.parseInt(value1.getText().toString());

v2 = Integer.parseInt(value2.getText().toString());

try {

res = service.add(v1, v2);

} catch (RemoteException e) {

e.printStackTrace();

}

result.setText(Integer.valueOf(res).toString());

}

});

}

@Override

protected void onDestroy() {

super.onDestroy();

releaseService();

}

/*

* This inner class is used to connect to the service

*/

class AdditionServiceConnection implements ServiceConnection {

public void onServiceConnected(ComponentName name, IBinder boundService) {

service = IAdditionService.Stub.asInterface((IBinder)boundService);

Toast.makeText(HelloSumAidlActivity.this, "Service connected", Toast.LENGTH_LONG).show();

}

public void onServiceDisconnected(ComponentName name) {

service = null;

Toast.makeText(HelloSumAidlActivity.this, "Service disconnected", Toast.LENGTH_LONG).show();

}

}

/*

* This function connects the Activity to the service

*/

private void initService() {

connection = new AdditionServiceConnection();

Intent i = new Intent();

i.setClassName("com.android.hellosumaidl", com.android.hellosumaidl.AdditionService.class.getName());

boolean ret = bindService(i, connection, Context.BIND_AUTO_CREATE);

}

/*

* This function disconnects the Activity from the service

*/

private void releaseService() {

unbindService(connection);

connection = null;

}

}

将此项目运行起来,得到的两个截图如下:

eb031fd3ce22742127f4f3be2c1745cf.png

Fig 1 : 填写数字前

2580284e35d792bad487fa32d366f630.png

Fig 2 : 按下计算按钮后

后记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL新建用户,授权,删除用户,修改密码

来源:http://www.cnblogs.com/analyzer/articles/1045072.html 首先要声明一下:一般情况下,修改MySQL密码,授权,是需要有mysql里的root权限的。 注:本操作是在WIN命令提示符下,phpMyAdmin同样…

机器学习 TOP 10 必读论文 | 资源

来源:AI科技大本营编辑 | DonnaMedium上的机器学习深度爱好者必关注的账号Mybridge照例对11月发表的学术论文进行了排名,整理出了10篇必读论文,建议收藏深读。1. Alpha Zero:用强化学习算法对中国象棋和国际象棋进行自我修炼&…

爱奇艺首页底部导航按钮android,仿爱奇艺/腾讯视频ViewPager导航条实现

仿爱奇艺/腾讯视频ViewPager导航条实现,支持自定义导航条高度,宽度,颜色变化,字体大小变化。支持多种滚动模式,支持自定义每个TabView的样式。项目地址:https://github.com/KCrason/DynamicPagerIndicatord…

详解MYSQL数据库密码的加密方式及破解方法

来源:http://www.heibai.net/articles/hacker/mimapojie/2009/0908/841.html MYSQL数据库用户密码跟其它数据库用户密码一样,在应用系统代码中都是以明文出现的,在获取文件读取权限后即可直接从数据库连接文件中读取,例如asp代码中…

4-Docker命令之docker logs

1.docker logs介绍 docker logs命令是用来获取docker容器的日志 2.docker logs用法 docker logs [参数] CONTAINER [root@centos79 ~]# docker logs --helpUsage: docker logs [OPTIONS] CONTAINERFetch the logs of a containerAliases:docker container logs, docker lo…

亚马逊等智能音箱“偷听”用户 被指收集隐私

来源:中国评论通讯社概要:近日,美国消费者保护组织Consumer Watchdog出具的一份报告显示,来自亚马逊和谷歌的专利申请曝光了其智能音箱是如何“偷听”用户的。据英国《每日邮报》报道,近日,美国消费者保护…

android camera捕捉,通过android camera2 API捕捉4:3相机图片与16:9传感器阵列相机

我想从使用Camera2 API(Android 5.0版本中添加)的Android fron-facing相机以4:3的宽高比捕捉视频。它工作正常,除非相机有16:9传感器阵列(作为三星Galaxy S5上的前置摄像头)。在这种情况下,图像看上去就像是16:9图像被…

HTTP 相应头相关

If-Modified-Since & If-None-MatchIf-Modified-Since,和 Last-Modified 一样都是用于记录页面最后修改时间的 HTTP 头信息,只是 Last-Modified 是由服务器往客户端发送的 HTTP 头,而 If-Modified-Since 则是由客户端往服务器发送的头&am…

基于互联网云脑架构分析百度的现状与未来

前言:这是未来智能实验室基于互联网云脑架构,对世界科技企业的未来发展趋势进行分析的文章。因为百度排在BAT的首位,因此这个系列研究文章就从百度开始进行研究。作者:刘锋 计算机博士,互联网进化论作者互联网云脑&am…

华为鸿蒙操作界面,华为鸿蒙被“实锤”,操作界面曝光,为何被吐槽是换皮安卓?...

4月已经进入尾声,但鸿蒙系统的消息最近却变少了,记得此前发布Mate X2的时候,余承东表示要在4月份开始推送鸿蒙系统,Mate X2会成为首批升级机型。然而目前有不少用户吐槽称,依然还没有等到鸿蒙系统的推送,毕…

将文件内含有的特殊字符还原

如下文件内容: 这里有特殊字符:\n 、\t 、\u4e0a 、\/ 我要做的事,就是恢复其特殊字符的作用(而不是打印被转义后的效果) 直观的看,很容易:直接替换不就行了 line line.replaceAll("\\n&…

【深度】谭铁牛院士谈人工智能发展新动态

来源: Frontiers11月25日,模式识别与人工智能学科前沿研讨会在自动化所召开。会上,谭铁牛院士做“人工智能新动态”报告,回顾了近代以来历次科技革命及其广泛影响,并根据科学技术发展的客观规律解释了当前人工智能备受…

android keyboard用法,react-native-android-keyboard-adjust 最新使用方法 0.63

react-native 安卓动态调整 android:windowSoftInputMode"stateAlwaysHidden|adjustResize" 键盘模式最近尝试使用, 还能正常工作, 最新的react-native0.63依然可以正常使用, 方法如下:npm install --save react-native-android-keyboard-adjust1.2.0 装包复制 Andro…

屏蔽在线视频广告的方法

原理是改hosts的! 第一步:找到C:\WINDOWS\system32\drivers\etc里面的hosts文件,双击打开,选用记事本打开。 #优酷 127.0.0.1 atm.youku.com 127.0.0.1 Fvid.atm.youku.com 127.0.0.1 html.atm.youku.com 127.0.0.1 valb.atm.youku.com …

android批处理脚本,BAT批处理一键生成APK包脚本分享

BAT批处理一键生成APK包脚本分享将本bat放到cocos2dx目录下你的工程的project.android下(需修改变量)。ASmaker 用来将Resources文件夹下的lua文件批量加密 算法参考我之前的rc4算法实现。每次打包apk前 svn 最新的工程代码 和 cocos2dx引擎代码。echo offrem 工具路径set JAVA…

智能产品AI服务智商的权重研究|未来研究

作者:刘锋 计算机博士 互联网进化论作者前言:本文是未来智能实验室关于智能产品智商的最新研究文章,在提出人工智能的三种智商后,通过德尔菲法,对智能产品AI 服务智商的权重进行了确定,为2018年智能产品的…

前端 html5 css3 框架,UI,分享,CSS3,HTML5,前端框架

随着HTML5和CSS3以及网页设计布局的全面翻新创新改革。让很多网页设计者和界面设计师都知道一个道理。就是去掌握一套对应的工具包。这不仅仅是未来提高工作的效率,还能更好的去处理网页整体视觉效果。界面也可以做得更有交互性。优秀的工具包可以让您的工作事半功倍…

深入理解闭包

详细出处参考:http://www.jb51.net/article/24101.htm 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可…

机器视觉行业的现状和未来

来源:科济天下网概要:在智能制造过程中,机器视觉主要用计算机来模拟人的视觉功能,也就是把客观事物的图像信息提取、处理并理解,最终用于实际检测、测量和控制。实现“中国制造2025”,完成从制造大国向制造…

学计算机专业的自荐信,浙江大学(计算机类)自主招生自荐信范文

浙江大学(计算机类)自主招生自荐信范文尊敬的浙江大学的招生办老师:您好!我是来自浙江省XX中学高三(8)班的XXX 。感谢您耐心看完我的个人申请资料。我身为一个浙江人,心目中的理想大学自然是浙江大学。“求是,创新。”是浙大的校训&#xff0…