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

news2024/11/24 20:47:18
我这里案例是 通过 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>() {
        @Override
        public DemoBean createFromParcel(Parcel in) {
            return new DemoBean(in);
        }

        @Override
        public DemoBean[] newArray(int size) {
            return new DemoBean[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public 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 statements

interface 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
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }
    private DemoInterface.Stub binder=new DemoInterface.Stub(){
        private DemoBean demoBean;
        @Override
        public void setDemoBean(DemoBean demoBean) throws RemoteException {
            Log.e("TAG","测试名字---"+demoBean.getName());
            this.demoBean=demoBean;
        }
        @Override
        public 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">
    <Button
        android:onClick="btn0"
        android:text="绑定服务"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <Button
        android:onClick="btn1"
        android:text="get"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <Button
        android: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;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    private class DemoServiceConnection implements ServiceConnection{
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            demoInterface=DemoInterface.Stub.asInterface(iBinder);
        }
        @Override
        public 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.coloradmin.cn/o/753888.html

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

相关文章

TypeScript 学习笔记 环境安装-类型注解-语法细节-类-接口-泛型

文章目录 TypeScript 学习笔记概述TypeScript 开发环境搭建 类型注解类型推断 数据类型JS的7个原始类型Array数组object、Object 和 {}可选属性 ? 和 可选链运算符?. function函数TS类型: any类型 | unknow类型TS类型: void类型TS类型&#xff1a;never类型 &#xff08;几乎…

数据库应用:CentOS 7离线安装MySQL与Nginx

目录 一、理论 1.安装依赖 二、实验 1.离线安装MySQL与Nginx 2.离线安装Nginx 三、问题 1.执行nginx -v命令报错 四、总结 一、理论 1.安装依赖 &#xff08;1&#xff09;概念 安装依赖是指在软件开发中&#xff0c;为了运行或者编译一个程序或者库&#xff0c;在计…

JVM——类加载和垃圾回收

目录 前言 JVM简介 JVM内存区域划分 JVM的类加载机制 1.加载 双亲委派模型 2.验证 验证选项 3.准备 4.解析 5.初始化 触发类加载 JVM的垃圾回收策略 GC 一&#xff1a;找 谁是垃圾 1.引用计数 2.可达性分析 &#xff08;这个方案是Java采取的方案&#x…

k210学习篇(一)环境搭建

一、为什么选择Canmv开发板? 便宜!便宜!便宜!淘宝200即可买到一个能带摄像头和LCD屏等等的开发板 二、利用Maix Hub在线训练 Maix Hub官网https://maixhub.com/home Maix Hub使用教程:K210学习笔记——MaixHub在线训练模型(新版) 注意: 三、配置开发环境 1.MaixPy IDE…

某网站提交登陆信息加密JS逆向实战分析

1. 写在前面 对于爬虫开发者来说&#xff0c;职业生涯中可能或多或少会遇到各种各样的网站&#xff0c;其中有些必要要求登陆才能浏览。那么模拟登陆的时候发现提交的登陆信息&#xff08;用户名、密码&#xff09;都是经过加密后的&#xff0c;如何处理&#xff1f;这里找到了…

我只改五行代码,接口性能提升了 10 倍!

背景 某公司的一个 ToB 系统&#xff0c;因为客户使用的也不多&#xff0c;没啥并发要求&#xff0c;就一直没有经过压测。这两天来了一个“大客户”&#xff0c;对并发量提出了要求&#xff1a;核心接口与几个重点使用场景单节点吞吐量要满足最低500/s的要求。 当时一想&am…

C++ IO流

文章目录 C语言的输入与输出流是什么?CIO流C标准IO流C文件流 stringstream的简单介绍 C语言的输入与输出 在C语言中,我们使用最频繁的输入输出方式为: scanf 和 printf. scanf : 从输入设备(键盘)读取数据,并将值存放在变量中.printf: 将指定的文字/字符串输出到标准输出设备…

数据库约束与表的关系(数据库系列4)

目录 前言&#xff1a; 1.数据库的约束 1.1约束类型 1.1.1 not null 1.1.2 unique 唯一约束 1.1.3 default 默认值约束 1.1.4 primary key 主键约束 1.1.5 foreign key 外键约束 2.表的关系 2.1 一对一 2.2 一对多 2.3 多对一 3.新增 4.聚合查询 4.1聚合函数 4.…

Pinecone - 向量数据库

文章目录 关于 PineconeRoadMapSemantic SearchChatbots购买查看 API Key创建索引代码调用安装库 pinecone-client查看已经创建的索引创建索引插入数据获取索引统计分析信息查询索引,获取相似向量删除索引关于 Pinecone 官网 : https://www.pinecone.i

利用layui构建OA系统基本操作

一.编写方法&#xff08;增加&#xff0c;删除&#xff0c;修改&#xff0c;查询&#xff09; 通过继承BaseDao来实现通用&#xff0c;从而减少代码量&#xff0c;提高小路 1.增加 public int add(User user) throws Exception {String sql "insert into t_oa_user(name…

Windows7中使用SRS集成音视频一对一通话

SRS早就具备了SFU的能力&#xff0c;比如一对一通话、多人通话、直播连麦等等。在沟通中&#xff0c;一对一是常用而且典型的场景&#xff0c; 让我们一起来看看如何用SRS做直播和RTC一体化的一对一通话。 一、启动windows7-docker 二、拉取SRS镜像 执行命令:docker pull oss…

修改jar包中的文件内容

文章目录 导引查找是否存在需要修改的文件vim命令修改配置文件jar命令替换jar包中的文件(也可新增)解压jar包&#xff0c;修改后重新打包jar修改clas文件jar命令参数 导引 首先问问为什么要直接修改jar包中的文件&#xff0c;而不是重新打包&#xff0c;在非必要的情况下&…

【动手学深度学习】pytorch-参数管理

pytorch-参数管理 概述 我们的目标是找到使损失函数最小化的模型参数值。 经过训练后&#xff0c;我们将需要使用这些参数来做出未来的预测。 此外&#xff0c;有时我们希望提取参数&#xff0c;以便在其他环境中复用它们&#xff0c; 将模型保存下来&#xff0c;以便它可以在…

python数据挖掘基础环境安装和使用

文章目录 一&#xff0e;安装python环境二、库的安装2.1 使用pip命令安装virtualenvv扩展&#xff1a;cmd无法使用pip&#xff0c;报错&#xff1a;Fatal error in launcher: Unable to create process using ... 2.2 安装virtualenvwrapper-win2.3 新建一个用于人工智能环境的…

腾讯云 API 3.0(V3版签名) 通用接口 Delphi 版

目录 一、腾讯云API 3.0 简介&#xff1a; 二、Delphi 接口函数说明&#xff1a; 1. Delphi 接口包含的单元&#xff1a; 2. 同步调用和异步调用的区别&#xff1a; 3. 程序调用示例&#xff1a; 三、Delphi 版腾讯云API 3.0 版接口函数下载 四、演示程序录播 下载源程序…

DB2数据库SQL将不同行做合计

DB2数据库SQL将不同行做合计 案例&#xff1a; 将’GL’和’RZ’做合计&#xff0c;其他的不动。 SELECT SALE_TYPE,ROUND(CAST(SUM(aatp_weight) AS DOUBLE),2) AS aatp_weight FROM( SELECT CASE WHEN SALE_TYPE GL THEN RZ ELSE SALE_TYPE END AS SALE_TYPE, DEMAND_NUM / …

基于NXP iMX8MP处理器M7核心LVGL移植

By Toradex胡珊逢 LVGL (Light and Versatile Graphics Library)是一个轻量级的开源图形库&#xff0c;采用 C 或者 MicroPython 语言开发。可以在资源有限的 MCU 上轻松地绘制图形界面。Verdin iMX8M Plus 模块的处理器除了 Cortex-A53 核心外&#xff0c;还具有一个 Cortex-M…

如何运营校园外卖跑腿小程序

运营校园外卖跑腿小程序需要考虑多个方面&#xff0c;包括市场调研、合作伙伴选择、用户获取与留存、服务管理和推广等。下面是一些关键步骤和策略&#xff1a; 市场调研&#xff1a; 在开始运营之前&#xff0c;进行市场调研是非常重要的。了解目标用户的需求和习惯&#xf…

HarmonyOS学习路之方舟开发框架—方舟开发框架(ArkUI)概述

方舟开发框架&#xff08;简称ArkUI&#xff09;为HarmonyOS应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff08;组件、布局、动画以及交互事件&#xff09;&#xff0c;以及实时界面预览工具等&#xff0c;可以支持开发者进行可视化界面…

JVM系列(6)——类加载器详解双亲委派

一、类加载器 类加载器是一个负责加载类的对象&#xff0c;用于实现类加载过程中的加载这一步。 主要作用就是加载 Java 类的字节码&#xff08; .class 文件&#xff09;到 JVM 中&#xff08;在内存中生成一个代表该类的 Class 对象&#xff09;。 加载过程可以看 JVM系列&a…