Android 进程与进程之间的通信--AIDL详细教程,以传递对象为例,两个app实现

我这里案例是 通过 IPC 传递对象 (以DemoBean类为例)
  • 如下:

AIDL 使用一种简单语法,允许您通过一个或多个方法(可接收参数和返回值)来声明接口。参数和返回值可为任意类型,甚至是 AIDL 生成的其他接口。

AIDL 支持下列数据类型:
在这里插入图片描述

使用详情

  • 以下面这两个app为例:
    在这里插入图片描述
aidlapplication2(服务端)中的代码实现
  • 1、创建 DemoInterface.aidl
  • 2、创建一个DemoBean类

类必须支持 Parcelable 接口。支持 Parcelable 接口很重要,因为 Android 系统能通过该接口将对象分解成可编组至各进程的原语。

public class DemoBean implements Parcelable {private String name;private int age;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;}public DemoBean(String name, int age) {this.name = name;this.age = age;}protected DemoBean(Parcel in) {name = in.readString();age = in.readInt();}public static final Creator<DemoBean> CREATOR = new Creator<DemoBean>() {@Overridepublic DemoBean createFromParcel(Parcel in) {return new DemoBean(in);}@Overridepublic DemoBean[] newArray(int size) {return new DemoBean[size];}};@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(@NonNull Parcel parcel, int i) {parcel.writeString(name);parcel.writeInt(age);}
}
  • 3、在DemoInterface.aidl中创建方法 - - 我这里写了两个 一个写入,一个获取

parcelable DemoBean; 导包需要手写,注意这里面是没有提示的!!!
parcelable 的 p是小写
写完方法后别忘了 Rebuild project 重新编译一下项目!!!

在这里插入图片描述

// DemoInterface.aidl
package com.example.aidlapplication2;
parcelable DemoBean;
// Declare any non-default types here with import statementsinterface DemoInterface {/*** Demonstrates some basic types that you can use as parameters* and return values in AIDL.*/void setDemoBean(in DemoBean demoBean);DemoBean getDemoBean();
}
  • 4、 创建服务端 DemoService
public class DemoService extends Service {@Nullable@Overridepublic IBinder onBind(Intent intent) {return binder;}private DemoInterface.Stub binder=new DemoInterface.Stub(){private DemoBean demoBean;@Overridepublic void setDemoBean(DemoBean demoBean) throws RemoteException {Log.e("TAG","测试名字---"+demoBean.getName());this.demoBean=demoBean;}@Overridepublic DemoBean getDemoBean() throws RemoteException {return demoBean;}};
}
  • 5、 启动服务
aidlapplication1(客户端)中的代码实现
  • 1、复制 DemoInterface.aidl ,直接复制,DemoInterface.aidl的包名以及里面的内容必须一样
  • 2、这里我给了三个点击事件
    在这里插入图片描述
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><Buttonandroid:onClick="btn0"android:text="绑定服务"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid:onClick="btn1"android:text="get"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid:onClick="btn2"android:text="set"android:layout_width="wrap_content"android:layout_height="wrap_content"/>
</LinearLayout>
  • 3、MainActivity 的处理
public class MainActivity extends AppCompatActivity {private DemoServiceConnection demoServiceConnection;private DemoInterface demoInterface;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}private class DemoServiceConnection implements ServiceConnection{@Overridepublic void onServiceConnected(ComponentName componentName, IBinder iBinder) {demoInterface=DemoInterface.Stub.asInterface(iBinder);}@Overridepublic void onServiceDisconnected(ComponentName componentName) {}}//点击绑定服务public void btn0(View view){Intent intent=new Intent();intent.setAction("com.example.aidlapplication2.DemoService");intent.setPackage("com.example.aidlapplication2");//包名demoServiceConnection=new DemoServiceConnection();bindService(intent,demoServiceConnection,BIND_AUTO_CREATE);//绑定服务}//点击获取数据public void btn1(View view){try {DemoBean demoBean = demoInterface.getDemoBean();Log.e("TAG","get---"+demoBean.getName());} catch (RemoteException e) {throw new RuntimeException(e);}}//点击写入数据public void btn2(View view){try {demoInterface.setDemoBean(new DemoBean("花花",6));} catch (RemoteException e) {throw new RuntimeException(e);}}}

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

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

相关文章

avue 表单绑定值;avue表单项根据某项的值去联动显隐或是联动下拉数据;avue select切换与另外一个select的options联动

效果&#xff1a;发布type为shp时 数据相关的都隐藏&#xff0c;当发布type为postgis时则显示 1.avue表单绑定值 html <avue-form :option"option" v-model"publishForm"></avue-form> js data中定义 data() {return {publishForm: {},optio…

c#示例-json序列化和json树

序列化 由于指针和引用类型的存在&#xff0c;在运行中的程序中&#xff0c;数据不一定是整块的。 可能东一块西一块散落在内存的各个地方。 序列&#xff0c;是指连续且有序的一个整体。序列化就是把数据变为连续有序整体的过程。 经过这样处理后的数据就可以方便的进行传输…

Leetcode---353周赛

周赛题目 2769. 找出最大的可达成数字 2770. 达到末尾下标所需的最大跳跃次数 2771. 构造最长非递减子数组 2772. 使数组中的所有元素都等于零 一、找出最大的可达成数字 这题就是简单的不能在简单的简单题&#xff0c; 题目意思是&#xff1a;给你一个数num和操作数t&…

【通过迭代相位检索重建衍射图案和全息图中缺失信息】不完整衍射图案的迭代重建和缺失像素的恢复(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

基于深度学习的高精度猴子检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度猴子检测识别系统可用于日常生活中或野外来检测与定位猴子目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的猴子目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型…

Stable Diffusion - 提示词翻译插件 sd-webui-prompt-all-in-one

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131649921 sd-webui-prompt-all-in-one 是一个基于 stable-diffusion-webui 的扩展&#xff0c;目的是提高 提示词/反向提示词 输入框的使用体验&…

Android Camera2-预览、拍照、录像流程

一、Camera2实现预览、拍照、录像三大基础功能的流程框架图 Camera2关键几个类&#xff1a; CameraManager 管理手机上的所有摄像头设备。管理手机上的所有摄像头设备&#xff0c;它的作用主要是获取摄像头列表和打开&#xff08;openCamera&#xff09;指定的摄像头。 它其…

SpringBoot+微信小程序在线订餐小程序系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBoot微信小程序框架开发的在线订餐小程序系统。首先&#xff0c;这是一个前后端分离的项目&#xff0c;代…

并行计算框架Polars、Dask的数据处理性能对比

在Pandas 2.0发布以后&#xff0c;我们发布过一些评测的文章&#xff0c;这次我们看看&#xff0c;除了Pandas以外&#xff0c;常用的两个都是为了大数据处理的并行数据框架的对比测试。 本文我们使用两个类似的脚本来执行提取、转换和加载(ETL)过程。 测试内容 这两个脚本主…

我爱学QT--qt的网络编程

学习地址&#xff1a; QT网络编程之TCP通信_哔哩哔哩_bilibili QT网络编程有TCP和UDP。 TCP编程需要用到两个类&#xff1a;QTcpServer和QTcpSocket 本节课目标&#xff1a; 完成一个服务器和一个客户端 首先是经典的几步 先设计ui再设计逻辑实现 多看看写的文件理解吧

设计模式-简单工厂模式

文章目录 简单工厂设计模式什么是简单工厂?为什么使用简单工厂工厂模式代码实现简单工厂优缺点优点&#xff1a; 简单工厂设计模式 学习视频 什么是简单工厂? 简单工厂模式属于类的创建型模式&#xff0c;又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实…

vue中使用Pinia和Vuex详解

最具有争议的Pinia和Vuex那个更好&#xff1f; 我们使用Vue2的时候&#xff0c;Vuex作为一个状态管理工具在组件中使用方便了很多。Vue3推出后&#xff0c;虽然相对于Vue2很多东西都变了&#xff0c;但是核心的东西还是没有变的&#xff0c;比如说状态管理、路由等等。实际上&a…