AIDL的使用情况和实例介绍

AIDL解析(一):AIDL原理解析 AIDL编写 AIDL运行原理 AIDL 阅读详情

再温故下。


原味连接:http://blog.youkuaiyun.com/amazing7/article/details/51317253

AIDL是什么?

  AIDL (Android Interface Definition Language), Android接口定义语言,Android提供的IPC (Inter Process Communication,进程间通信)的一种独特实现。

什么情况下要使用AIDL

  使用AIDL只有在你允许来自不同应用的客户端跨进程通信访问你的service,并且想要在你的service种处理多线程的时候才是必要的。 如果你不需要执行不同应用之间的IPC并发,你应该通过实现Binder建立你的接口,或者如果你想执行IPC,但是不需要处理多线程。那么使用Messenger实现你的接口。

定义一个AIDL接口的步骤

  必须在一个.aidl文件中使用Java编程语言语法定义你的AIDL接口,然后在提供service的应用中和任何绑定到这个service的应用中的源代码中(在src目录吓)保存它。 
   
  当你编译包含.aidl文件的应用时,Android SDK工具基于这个.aidl文件生成一个IBinder接口,并且把它保存到项目的gen目录吓.service必须恰当的实现这个IBinder接口 之后客户端应用可以绑定到这个服务上,然后从IBinder调用方法来执行IPC。

使用AIDL建立一个邻接的service需要遵循下面的步骤:

1. 建立.aidl文件 

  这个文件使用方法签名定义了语言接口  
   
2.实现这个接口 

  Android SDk工具基于你的.aidl文件使用java语言生成一个接口 这个接口有一个内部抽象类,叫做Stub,它是继承Binder并且实现你AIDL接口的 你必须继承这个Stub类并且实现这些方法 
   
3.暴露这个接口给客户端 

  实现一个service并且覆盖onBind()方法返回你的Stub实现类。

你的.aidl文件必须被复制到其他应用程序中来让他们访问你service的接口,你必须维护原始接口的支持(向后兼容)。

用一个实例来分步骤说明

在server项目中建立.aidl文件 

这里写图片描述

  AIDL使用一个简单的语法让你声明一个带有一个或者多个带有参数和返回值方法的接口 参数和返回值可以是任何类型,甚至是AIDL生成的接口。 
   
  IService.aidl 
  


package com.example.aidl;


interface IService {

    String hello(String name); 
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在server项目中建立服务类

  当你编译你的应用时,Android SDK工具生成一个.java接口文件用你的.aidl文件命名生成的接口包含一个名字为Stub的子类,这是一个它父类的抽象实现,并且声明了.aidl中所有的方法。 
   
  Stub也定义了一些辅助的方法,最显著的就是asInterface(),它是用来接收一个IBinder(通常IBinder传递给客户端的onServiceConnected()回调方法)并且返回一个Stub接口的实例 。

  一旦你为service实现了接口,你需要把它暴露给客户端,这样他们才能绑定到上面 为了给你的service暴露接口,继承Service并且实现onBind()方法返回一个你实现生成的Stub类。

   AIDLService.java

public class AIDLService extends Service {


    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // Return the interface
        return new IService.Stub() {
            @Override
            public String hello(String name) throws RemoteException {
                // TODO Auto-generated method stub
                return "hello"+name;
            }
        };
    }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

在server项目AndroidManifest中申明Service

<service 
  android:name="com.example.service.AIDLService" >
   <intent-filter>  
<action android:name="android.intent.action.AIDLService" />  
  </intent-filter> 
        </service>
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

把server项目中的aidl文件带包拷贝到client项目中(包名要相同)

这里写图片描述

MainActivity.java

public class MainActivity extends Activity {

    IService RemoteService; //监听服务
    private ServiceConnection mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // TODO Auto-generated method stub
            Log.i("mConnection", service+"");
            RemoteService = IService.Stub.asInterface(service);

            try {
                String s= RemoteService.hello("finch");
Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub

        }

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initService();
    }
    //连接服务
        private void initService() {
            Intent i = new Intent( );
            i.setAction("android.intent.action.AIDLService");
            boolean ret = bindService(i, mConnection, Context.BIND_AUTO_CREATE);
        }

        //断开服务
        private void releaseService() {
            unbindService(mConnection);
            mConnection = null;
        }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        releaseService();
    }
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

运行结果:

AIDL实例分析和讲解 前言 为使应用程序之间能够彼此通信,Android提供了IPC (Inter Process Communication,进程间通信)的一种独特实现: AIDL (Android Interface Definition Language, Android接口定义语言)。 这篇文章将通过一个项目来介绍AIDL用法,包含了service和client。可能简单了些,不过轻省许多。 这篇博文 阅读详情

相关推荐

适用于 HAL 的 AIDL

Android 11 引入了在 Android 中使用 AIDL 实现 HAL 的功能。这样就可以在不使用 HIDL 的情况下实现 Android 的部分代码。我们强烈建议尽量将 HAL 转换为只使用 AIDL(如果上游 HAL 使用 HIDL,则必须使用 HIDL)。 如果 HAL 使用 AIDL 在框架组件(例如system.img中的组件)和硬件组件(例如vendor.img中的组件)之间进行通信,则必须使用稳定的 AIDL。不过,如需在分区内进行通信(例如从一个 HAL 到另一个),则对所...

你好呀,信田君! 5663

AIDL使用入门

AIDL是什么?   AIDL (Android Interface Definition Language), Android接口定义语言,Android提供的IPC (Inter Process Communication,进程间通信)的一种独特实现。 什么情况下要使用AIDL   使用AIDL只有在你允许来自不同应用的客户端跨进程通信访问你的service,并且想要在你的service...

风轻云喏 635

AIDL的示例以及自己简单实现一个AIDL

AIDL的示例以及自己简单实现一个AIDL ,code具有一定的参考意义,让人理解AIDL是怎么完成远程调用的

AIDL灵活运用,避免创建多个Service

前面转载了一篇AIDL的入门文章,从那时开始接触的AIDL。  AIDL的使用一般是一个客户端,一个服务端。服务端返回一个AIDL接口,客户端拿到该接口调用方法。 但是,如果项目中有大量的AIDL文件,那么就要建相应个数的Service,这显然是不合理,现在介绍一种方法,优化AIDL的使用。先帖服务端的目录结构图 MainActivity是默认的,没添加任何代码,直接忽略。首先先看三

xiaoxie12321的博客 1273

常见的AXI总线仲裁器概述-AXI协议理解(一)

SoC 设计广泛采用共享总线式的片上通信,其中的仲裁器是共享总线的关键技术之一。AMBA AXI 总线协议以高性能、高频率的系统设计为目标,适合高带宽、低延迟的系统设计,可以达到高频率的操作而不需要复杂的总线桥,满足众多部件的接口要求,具备高度灵活的互联结构,并且向后兼容 AHB 和 APB 接口。

Paul 安的博客 1万+

Silvaco Atlas从头开始(四)——定义材料参数和模型

这部分是关于定义材料参数和模型。

qsz1425AWD2121的博客 4649

AIDL连接池的实现

参考《Android开发艺术探索》学习一下AIDL的连接池实现 回顾一下AIDL使用的大致流程:首先创建一个Service和一个AIDL接口,接着创建一个类继承自AIDL接口中的Stub类并实现Stub中的抽象方法,在Service的onBind方法中返回这个类的对象,然后客户端就可以绑定服务端Service,建立连接后就可以访问远程服务端的方法了。 现在考虑一种情况:公司的项目越来越庞大了,现在...

flowerff的博客 492

pandas,构造MultiIndex的四种方法:from_tuples、from_arrays、from_product、from_frame

1、from_tuples:通过 “元组对” 构造MultiIndex """ 一对元组,为一个索引 """ tuples = [(1, 'red'), (1, 'blue'), (2, 'red'), (2, 'blue')] pd.MultiIndex.from_tuples(tuples, names=('number', 'color')) 2、from_arrays:通过 “列表元素的组合” 构造MultiIndex """ 列中表的元素,按位置 对应组合,形成索引 """ arrays

jieru_liu的博客 5387

Android AIDL解惑 什么时候使用,该怎么使用?

1 AIDL 什么时候使用? AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写。 作为进程间通信的重要方式之一?什么时候需要用到呢? 场景1 现在你的应用需要强制保活,产品经理要求做进程保活,在应用中多开一个进程,用来与主进程进行心跳监听,如果有一个进程挂掉,另外一个进程将它拉起。这种需求常用于定制性设备的主应用。 场景2 要求两个应用间可以进行数据传递。

BonnySoul的博客 1485

STM32H5 USB虚拟串口:用Classic驱动移植CDC实践

USB虚拟串口(CDC)是嵌入式系统最常用的主机通信方式之一,本质是借助USB协议模拟串口收发,无需额外驱动即可在PC上生成COM口。其实现依赖USB设备协议栈完成枚举、控制传输与批量传输。传统USBD Classic库不依赖RTOS,代码轻量、调用链短,非常适合裸机或轻量状态机架构;而USBX功能强大但需要ThreadX内核,资源开销较大。在电机控制器、传感器采集等场景中,日志输出与参数配置仅需简单的双向数据通道,Classic驱动往往更务实。本文基于STM32H5平台,详细梳理了使用Classic驱动移

weixin_29178069的博客 334

电商秒杀场景下,如何用Redis+Lua脚本实现原子性库存扣减(附完整代码)

本文针对电商秒杀场景下的高并发与超卖难题,详细解析了如何利用Redis的原子性命令与Lua脚本实现可靠的库存扣减。通过对比多种方案,阐述了Redis+Lua作为黄金搭档的技术原理,并提供了从基础扣减到预扣减模型的完整代码实现,确保在高并发下数据的一致性与系统性能。

weixin_29219539的博客 503

Android Studio 上jar包,aar包,aidl,aidl打成aar包的正确使用

由于一直做的是系统rom开发,对于jar包,aar包,aidl,aidl打成aar包这些东西之前一直没有比较明晰的实践,以及哪些场合下需要这些方法,这些方法有哪些优劣以及局限性。 抽时间每种方式都在Android Studio上详尽的实践了一遍,有以下收获。为了方便大家理解,最好根据我这边上传的源码就自己实践一遍。demos都是基于Android Studio 3.2版本做的。 demos下载...

Mis_wenwen的博客 6721

把 SAP Event Mesh 讲透:从事件驱动架构到 SAP BTP 落地实践

摘要: SAP Event Mesh是SAP BTP上的云端消息与事件服务,支持企业构建解耦、弹性的应用架构。它通过异步通信模式(如发布/订阅)解决传统同步集成的痛点,如系统紧耦合、链路脆弱等问题。核心能力包括事件驱动通信、可靠消息投递(支持至少一次送达)、与SAP生态深度集成(如S/4HANA事件扩展)以及混合环境支持。典型场景包括订单处理、库存同步等,发布方只需发出业务事件,订阅方按需消费,避免系统间直接依赖,符合Clean Core理念。两种关键模式为广播式的Publish/Subscribe和定向的

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 116

AIDL 详细介绍及使用

从某种意义上说AIDL其实是一个模板,因为在使用过程中,实际起作用的并不是AIDL文件,而是据此而生成的一个IInterface的实例代码,AIDL其实是为了避免我们重复编写代码而出现的一个模板。方法入手,在上面的代码中可以看到,主要的作用就是根据传入的Binder对象转换成客户端需要的 IMyAidlInterface 接口。服务端的代码差不多就这些,下面我们来看看客户端的,客户端也是需要 AIDL 文件的,可以从服务端中复制过来。看完上面方法的介绍,我们回过头来看看 AIDL 例子中实现的流程。

u013773608的博客 8585

Vue3 - 超详细最新 wangEditor V5 富文本编辑器安装引入及使用教程,提供工具栏配置、基础富文本功能、API使用示例教程等(新手小白快速引入并植入到项目中)

vue3,wangEditorv5富文本编辑器,wangEditorv5官方文档,vue3最新安装wangEditorv5富文本详细使用教程,vue3使用wangEditorv5编辑器示例代码,vue3网站网页安装植入富文本编辑器教程,vue3wangEditor使用api,vue3安装富文本控制台出现报错如何解决,vue3wangEditor-v5工具栏配置,vue3中使用富文本编译器wangEditor5的方法,wangeditor5在vue3中的全使用过程,vue3超详细最新wangedi

🏆 前端领域优质创作者 4253

4 屏 + 8 摄像头一开,谁在悄悄拖慢你的座舱域控?

如果你觉得座舱卡顿:❌ 别第一反应怪 SoC❌ 别盲目堆算力。

weixin_43199439的博客 148

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

前言为使应用程序之间能够彼此通信,Android提供了IPC (Inter Process Communication,进程间通信)的一种独特实现: AIDL (Android Interface Definition Language, Android接口定义语言)。网上看了几篇关于AIDL的文章,写得都很不错,不过例子构造大多略微复杂: 建立两个Android项目,一个是client,一个是s...

weixin_30368405的博客 514

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Android】Binder(一)Binder的介绍和AIDL使用Binder的实例

Binder的介绍和AIDL使用Binder的实例

每天不是在写bug就是在写bug的路上 5071

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

AIDL 和 HIDL

Aandroid

u010783226的专栏 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android中AIDL细解及实例

一、基本 aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口 icp:interprocess communication :内部进程通信。 在Android中, 每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢? 显然, Ja

九楼@三梯的专栏 2279

Binder 一、应用层AIDL:背景介绍和使用。

写在前面:我刚入行的时候,带头大哥就告诉我,Android中Binder很重要,但是Binder是什么?我问他,他也说不清楚,我去网上看文章,我发现他们也都写得很模糊,不清晰,从哪个时候起,“Binder是什么?谷歌为什么要单独搞一个Binder出来做IPC通信?”这个问题就一直困扰着我。我尝试着去看过很多人的博客,但是说到系统层和内核时我就看不懂,太抽象了。我写Binder系列的文章,尝试从我自己的角度去理解Binder,由浅入深从应用层AIDL使用开始。这个系列可能会跨越很长的时间。

weixin_43522377的博客 1048

Android应用中通过AIDL机制实现进程间的通讯实例

在Android中,每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢?显然,Java中是不支持跨进程内存共享的,因此要传递对象,需要把对象解析成操作系统能够理解的数据格式,以达到跨界对象访问的目的。在Android中,则采用AIDL(Android Interface Definition Language :接口定义语言)方式实现。 AIDL (Android I

Android-Idea 4万+

android之Service介绍之二 AIDL

首先描述下我们想要实现的内容,我们希望在一个应用中通过点击按钮,去操作另一个进程中应用的音乐播放功能。如图,我们点击“播放”时,系统就会去远程调用我们提供的一个service(与当前service不是同一个应用哦),然后操作service中的音乐播放,点击“停止”则会终止播放。想要重新播放的话,必须先点“销毁service”,再点播放按钮哦。(至于这里为什么要先点销毁按钮才能播放,完全是为了给大家展示下,远程调用service时,怎么去解绑service)。       在这个例子中,我们用到了一个非常重要

梦中一夜下江南 3296
上一篇: 捕获异常信息_UncaughtExceptionHandler,保存日志到本地及发送服务器
下一篇: Error:Configurationwith name 'default' not found的问题解决
King·Forward
博客等级 码龄14年 117粉丝 218原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值