安卓漫漫路之AIDL传递简单数据.

Android:AIDL简单介绍+传递简单数据+传递复杂数据 AIDL简单介绍+传递简单数据+传递复杂数据.AIDL的目的就是实现进程之间的通信,尤其是在涉及多进程并发情况下的进程间通信。可以将aidl理解为两个进程之间的桥梁,并制定规则,使其传输特定数据。 阅读详情

AIDL:Android Interface Define Language(Android接口定义语言),

主要用于服务端与客户端进程间通信(当然也可以多客户端);

大写的PS:  远离手机,没事就得多抬头.

二月二,龙抬头,天子耕地臣赶牛,春耕夏耘率天下,五谷丰登太平秋。
言归正传:Android中跨进程间通信方式有很多种方式: 比如 aidl, Messenger, 文件共享, 广播(BroadCast), ContentProvider,Socket(网络通信)  ,每种方式都有自己的使用场景和优缺点.

AIDL默认情况下只能传递基本类型、String、List、Map、CharSequence。下篇讲解传递复杂数据类型.

本章由我给您介绍使用Android Studio实现跨进程传递简单数据String类型(aidl);

--------------------------------------------------------

首先配上服务端的代码,也就是咱们的AppOne的代码:

第一步 : 创建AIDL文件.

步骤:File –> New –> AIDL –> AIDL File 完成创建之后(默认名称),

可以看到src/main的目录下生成了一个IMyAidlInterface.aidl文件.

不管他默认生成什么方法.咱们把他改成咱们想要的方法.例如:

package com.it.heima.;
interface IMyAidlInterface {
    String getValue();
}




然后手动编译,clean | rebuild | make moudle "app";当然最后一个是最合适的,前者都太耗时.

然后怎么查看是否编译成功呢?

成功的话会在app/build/generated/sourse/aidl/debug/com.it.heima/下给咱们生成一个IMyAidlInterface接口.

第二步 : 创建远程服务Service.

package com.it.heima;
import com.it.heima.IMyAidlInterface;
public class MyService extends Service {
    IMyAidlInterface.Stub stub = new IMyAidlInterface.Stub(){

        @Override
        public String getValue() throws RemoteException {
            return "这是服务端返回的内容";
        }
    };
    @Override
    public IBinder onBind(Intent intent) {
        return stub;
    }
}



PS : IMyAidlInterface.Stub即为服务端AIDL文件的代理对象.

第三步 : 在AndroidMenifest.xml中的application标签中配置Service.

<!-- MyService -->
        <service
            android:name=".MyService"
            android:process=":remote">
            <intent-filter>
                <action android:name="com.it.heima.MyService" />
            </intent-filter>
	</service>





Android系统最大的进程是com.android.phone.

process: 如果不自己指定的话此service默认运行在自己的包的进程中,也就是com.it.heima进程中.

如果自己指定的话会运行在com.it.heima:remote;

加不加冒号又分两种区别 : 

一,加冒号 : 表示该服务所在的进程是私有的.当客户端需要该service时,系统会自动创建新进程.

二,不加冒号,表示该服务所在的进程是共享的,当几个客户端都需要该service时,会共用一个进程.


至此服务端的配置完毕.

-----------------------------------------------------------------------------------------

配置客户端的代码,也就是咱们的AppTwo的代码:

第一步 : 需要将服务端的main/aidl包拷贝到客户端的app/main下.手动编译.查看是否成功.

第二步 : 客户端绑定服务端服务(远程服务).

package com.it.baima;
import com.it.heima.IMyAidlInterface;
public class MainActivity extends Activity implements View.OnClickListener {
    private IMyAidlInterface mService;
    private Button btn_bind, btn_get;
    private TextView tv;
    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mService = IMyAidlInterface.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mService = null;
        }
    };

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

    private void init() {
        btn_bind = (Button) findViewById(R.id.btn_bind);
        btn_get = (Button) findViewById(R.id.btn_get);
        tv = (TextView) findViewById(R.id.tv);

        btn_bind.setOnClickListener(this);
        btn_get.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_bind:
                Intent intent = new Intent();
                intent.setAction("com.it.heima.MyService");
                //从 Android 5.0开始 隐式Intent绑定服务的方式已不能使用,所以这里需要设置Service所在服务端的包名
                intent.setPackage("com.it.heima");
                bindService(intent, connection, Context.BIND_AUTO_CREATE);
                break;
            case R.id.btn_get:
                try {
                    String str = mService.getValue();
                    tv.setText(str);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (serviceConnection != null) {
            unbindService(connection);
        }
    }

}




就是一个简单的界面上方有两个Button(bindButton和getButton),和一个TextView.

首先点击bindButton后通过bindService绑定服务端的MyService.

通过 mService = IMyAidlInterface.Stub.asInterface(service)

可以获取到服务端的代理对象,从而可以通过回调方法从服务端获取到我们所需的数据从而展示到我们的客户端.


运行AppTwo,点击bindButton,好的已经绑定好了服务,再点击getButton通过回调方法获取到AppOne的数据.并且等待下方的TextView改变字体.我去,我裤子都脱了你给我看空指针异常?好吧,log指示getValue为空.怎么为空呢?咱们明明return了一个字符串啊.后来一想...AppOne都没有运行到咱们的手机上.从哪里访问服务呢?setAction,setPackage的操作都白做了,系统根本找不到啊.想让进程间通讯怎么只能运行一个进程呢?赶紧把咱们的AppOne先运行到手机上,这样两个进程都存在,才叫进程间通讯嘛.再运行一下看看咱们的AppTwo,好的,这回裤子没白脱.


传递复杂数据类型.请看大牛文章Android进程间通信之----Aidl传递对象




如有问题请多指正,您的指正使我更正确的前行.

Android AIDL传输数据 1、后台服务里是一个Android项目,是一个Service 后台服务 2、前台Activity里是一个Android项目,是一个从后台服务 中通过AIDL获取简单数据与复杂数据 导入,分别运行(先运行后台服务,没有界面),在运行前台界面(先绑定,再点击中间按钮,最后点击解除绑定) 立即下载

相关推荐

k最近邻算法——电影分类及案例详解

如图3-7所示,若将国际象棋棋盘放在二维直角坐标系中,格子的边长定义为1,坐标的x轴及y轴和棋盘方格平行,原点恰落在某一格的中心点,则王从一个位置走到其他位置需要的步数恰为二个位置的切比雪夫距离,因此切比雪夫距离也称为棋盘距离。关于这里的距离度量,这个电影分类的例子有2个特征,也就是2维的,可以使用我们高中学过的两点距离公式(两点距离公式其实就是欧氏距离在二维空间上的公式,也就是欧氏距离n的值为2的情况,欧氏距离也称为欧几里德距离)来计算距离,如图3-3所示。对数据进行归一化,避免量纲对计算距离的影响。

ZhShy 4555

Android 使用AIDL传输超大型文件

一道面试题:使用AIDL实现跨进程传输一个2M大小的文件 - 掘金该文章与本文类似,都是使用AIDL向接收端传输,不过该文中使用共享内存MemoryFile构造出,MemoryFile的创建需要使用反射,对于使用MemoryFile映射超大型文件是否会导致内存占用过大的问题,我个人没有尝试,欢迎有兴趣的朋友进行实践。ParcelFileDescriptor 是一个封装了文件描述符的类,可以通过 Binder 传递给其他进程,实现跨进程访问文件或网络套接字。

Dream It Possible 2292

2021.11.23 Covins 多机器人单目协同建图 跑Euroc数据集 更新

近日,一直在调试如何使用Covins跑通数据集,因为是初学者,所以很多bug出来的时候原理都不懂,只能复制——百度——尝试解决的过程。 现分享一下近日的结果以及与Covins作者帮助解答的一些问题。 使用代码行跑依次跑Euroc多数据集 这里的意思是使用作者提供的covins_examples文件夹中的euroc_examples_mh123_vigba.sh文件,这个文件是将三个Euroc数据集依次运行,跑完第一个数据集,第二个数据集运行的时候在第一个数据集生成地图的基础上继续绘制,由于我只下载了两个数据

qq_42614598的博客 2474

Android AIDL通信之对象与普通数据

左图为客户端,右图为服务端: 客户端: 1.建立个aidl文件,IRemoteService.aidl: package aidlserver; import aidlserver.Student; interface IRemoteService{ String MyString(String a); Student GetObject(inout Student stu);

qq1170762202的博客 352

如何区分Info与CoWoS封装?

这篇文章主要从Info、CoWoS封装的定义、Interposer的种类以及Info、CoWoS封装的种类三方面进行了介绍,希望读者能够有所收获

wangyubo1的博客 7938

100G UDP FPGA上板测试:系统级压力验证方法论

100G以太网是高速网络基础设施的核心能力指标,其本质是对FPGA平台在物理层、链路层与系统协同层面的极限验证。UDP协议因无重传机制,放大了时序违例、电源噪声、信号完整性等底层问题的影响,使‘上板测试’远超功能验证范畴,成为检验硬件鲁棒性的关键环节。开源UDP协议栈(如LiteEth)虽降低入门门槛,但真实线速稳定运行依赖严格的PCB设计、时序收敛与热-电-时联合调试。典型应用场景涵盖数据中心交换、金融低延迟通信及AI集群互联,需融合BERT眼图分析、Vivado时序报告解读、DPDK压测与红外热成像等跨

weixin_34246551的博客 549

ctle电路求帮忙分析低中高频调节原理,搭好了电路该怎样调节参数?

🏆本文收录于专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家!持续更新中,up!up!up!!

**My Coding Family** 1127

android之aidl进程间通讯数据传输

一、前言 AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写,AIDL的作用是绑定一个其他APP的service,用于进程间的通讯。 在Android系统中,每个进程都运行在一块独立的内存中,在其中完成自己的各项活动,与其他进程都分隔开来。可是有时候我们又有应用间进行互动的需求,比较传递数据或者任务委托等,AIDL就是为了满足这种需求而诞生的。通过AIDL,可以在一

lss0555的博客 1279

一步一步教你如何安装IP-Guard(客户端WINDOWS篇)

1、安装完服务器后,在服务器右下角有一个IP-GUARD图标:如图 2、点图标右键选注册: 3、注册成功后, 4、在开始菜单里选生成客户端安装包。 5、生成客户端安装包成功,安装名字可以任意,但是最好是英文名字。 6、将客户端安装程序复制到桌面。 7、退出所有杀毒软件、安全卫士、电脑管家等然后运行 8、安装完成后,立即重启计算机。IPguard客户端安装完成。 9、这样在控制里就可以看到已经安装客户端的计算机,在线显示蓝色,灰色表示计算机已经离线货关机 ...

IP-Guard专栏 5623

基于FPGA的万兆以太网学习(1)

万兆(10G) 以太网测速视频:SFP+屏蔽笼可以插入千兆或万兆光模块。SFP+信号定义与 SFP 一致。

baidu_34971492的博客 2250

安卓面试小结.

1.Retrofit框架的结构是什么?底层是怎么实现的? 简述:(这里可能理解不到位,链接里面比较详细)  对okhttp的进一步封装,它使用的是动态代理的技术,通过扫描注解构造请求体,底层使用okhttp进行网络请求,利用handler进行异步操作。 底层具体实现: 源码解析: Retrofit2.0源码解析 2.网络框架是如何搭建的?Okhttp的底层实现是什么,和Retrofit有

HighForehead的博客 2434

智算中心建设项目初步设计方案

本项目面向区级政府、智算中心及文旅从业者,聚焦某区智算中心一期建设,响应数字经济与智慧城市建设政策,推动文旅产业升级。遵循统筹规划、数据驱动原则,目标打造智慧文旅样板。建设内容涵盖云网数据底座(以租代建)、数据中台(全生命周期管理)、智慧文旅平台(含“一机游”电商)及气象监测等配套,采用前后端架构与低代码开发,强化三级等保与纵深防御,实现安全可控。方案融合多类资源目录,提供从设计到运营的完整技术支撑,助力区域智算与文旅深度融合。

cdfunlove的博客 111

Android点将台:绝命暗杀官[-Service-]

温故而知新,可以为师矣 至美不过回首,往事重重,顾来时,荆棘漫漫,血浸途中。 今铜衣铁靴,再行来路,任荆棘漫漫,唯落绿叶残枝。 ----张风捷特烈 复制代码 零、前言 在此之前希望你已经阅读了:Android点将台:颜值担当[-Activity-] 在此之前希望你已经阅读了:Android点将台:外交官[-Intent-] 1.本文的...

weixin_33725515的博客 174

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

android aidl 数组,Android回顾--(二十四) AIDL的简单以及传递复杂数据

AIDL:一种接口定义语言来公开服务的接口,跨进程访问的服务建立AIDL服务的步骤:服务端的实现在Java源文件目录下建立一个aidl文件,直接通过点击new创建aidl文件,Android Studio会自动帮你新建aidl包。具体位置如图:aidl文件位置.png//UserInfo.aidlpackagecom.ting.android.aidldemo;//Declareanyn...

weixin_34768798的博客 1095

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android AIDL中数据的传输

上面已经了解了AIDL的通信原理,那么就有必要说一说通信过程的数据传输了。首先肯定支持基本类型的传送,比如char ,int,string,byte,等。它还可以传输的类型有map,list,charsequence,这几种,当然map和list中泛型的支持必须是前面的基本类型。在使用List的时候需要指明是in还是out,如图所示在客户端的时候也必须使用ArrayList来接收。 那如果我们想

xingshang_love的博客 3471

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...

Android ipc数据传输方式之一 AIDL

AIDL 的全名是 Android Interface definition language,就是一种在安卓的接口定义语言,而它的作用就是主要用于不同进程之间的通信 一 如何在AndroidStudio中创建AIDL? 首先要创建一个AIDL文件 AndroidStudio 穿件方式如下图: 第一次这样创建完成后就会出现一个aidl的文件夹 然后我们创建一个aidl文件 写完

louyulin的博客 501

android aidl 数组,android之aidl的简单使用

aidl这里就不加累述它的概念定义等等,免得长篇大幅。下面介绍的是我第一次使用aidl成功与service通信的一个例子:1.在项目包下新建一个IInfo.aidl,并在其中添加你要调用的方法,格式和java中接口一样。package com.android.server;interface IInfo {boolean start();void stop();void locate(int x,...

weixin_35876682的博客 899

IPC机制之AIDL传递基础类型数据(一)

Q:为什么标题是基础类型呢? 这个需要我简单介绍下,在Binder基础上的IPC通信主要分为Messenger和AIDL,Messenger的本质也是AIDL,所以我们需要知道AIDL支持传递哪些类型的数据,见下图。 图片来自任玉刚的《Android开发艺术探索》 Q:Messenger和AIDL的区别? Messenger底层也是AIDL,只是屏蔽了其细节; 服务端的Messenger是串行的方

不死就继续 1341

AIDL进程通信+application

AIDL进程通信简介步骤服务端客户端 简介 AIDL,全称是Android Interface Define Language,即安卓接口定义语言,可以实现安卓设备中进程之间的通信(Inter Process Communication, IPC)。 步骤 服务端 在main文件夹下创建,新建adil文件记得重建。 在adil文件内添加自己需要的方法,用来处理数据。 interface Aidl...

Asu_yu的博客 421

android aidl 传递parcelable

一.截图 二.服务端 1.新建aidl文件夹 2.新建aidl文件(因为传递的是自定义类型,所以必须写个以类型命名的aidl文件) 注意:a.这里必须导入自定义类型,要不然不识别           b.形参必须指定in或者out IMyAidlInterface.aidl // IMyAidlInterface.aidl package com.caomingyu.parc...

瑺圊樹的专栏 2828

AIDL进程间传递复杂数据类型—AIDL传递android.os.Parcelable接口

AIDL进程间传递复杂数据类型系列: AIDL进程间传递复杂数据类型—AIDL传递其他AIDL接口AIDL进程间传递复杂数据类型—AIDL传递android.os.Parcelable接口=========================================前面我们讲到了AIDL进程间传递复杂数据类型—AIDL传递其他AIDL接口,现在我们接着来说第二种了。就是AIDL传递androi

欢迎关注微信公众号:DroidMind 2331

Android AIDL(接口定义语言)简单理解和基本使用方法

一、概述      AIDL意思即Android  Interface Definition Language,翻过来就是Android接口定义语言,是用于定义服务端和客户端通信接口的一种描述语言,可以拿来生产IPC代码,从某种意义上说AIDL其实就是一个模板,因为在使用过程中,实际起作用的并不是AIDL文件,而是据此生产的一个Interface的实例代码,AIDL其实是为了避免我们重复写代码而出

落岑博客 3863

Android -- 每日一问:AIDL是什么?你有使用过它吗,它支持哪些数据类型?

每日一问:AIDL是什么?你有使用过它吗,它支持哪些数据类型?

Kevin Learn Android 1326

Android AIDL的使用以及双向传输数据

Android Interface Definition Language,简称AIDL,是Android接口定义语言,用于进程间通信。当然你也可以通过发送广播达到进程间通信的目的,但广播会碰到延迟等现象,个人建议还是使用AIDL。 AIDL传输数据支持Java基本数据类型、List、Map以及实现Parcelable的类。接下来将通过一个实例来讲解下AIDL,并...

lhp1930的专栏 1855

进程间传递数据——AIDL传递对象

Aidl同样可以传递自定义的实现Parcelable接口的对象服务端1.在java中新建包com.test.aidl2.在aidl的包下新建Student.aidl文件,建好后我们会看到在main下自动生成一个aidl文件夹,其中包含我们新建的文件,而java下的包是空的,此时我们可以把java下的包删除文件中只有parcelable Student;3.在aidl文件中新建Student.jav...

qq_2790289459的博客 2714
上一篇: 安卓漫漫路之startActivityForResult的使用.
下一篇: 安卓面试小结.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值