Android利用AIDL实现apk之间跨进程通信

2023-11-09

AIDL 最广泛与最简单的应用是与四大组件之一 Serivce 的配合使用了。我们都知道,启动一个 Serivce 有两种方式:1、通过 startService 的方式;2、通过 bindService 的方式。 通过 binService 方式启动的 Service 所返回的对象类型,就可以理解为是 AIDL 跨进程通信类型。

一.服务端

首先创建一个服务端的apk项目,创建AIDL文件.

创建完成后结构如下:

 

可以看到AIDL文件所在的包和java包路径是一致的.

根据业务需求修改所创建的aidl文件.

package com.example.myserver;

// Declare any non-default types here with import statements

interface myhonaidl {
    
String getInfo(String info);
    
}

 接着创建对应的service.

package com.example.myserver;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

public class HonService extends Service {
    public HonService() {
    }
 
//重点步骤,用来实现接口    
public class MyBinder extends myhonaidl.Stub{
    @Override
    public String getInfo(String info) throws RemoteException {
        return xxxxx;
    }
}

//重点 记得返回实现接口的对象
    @Override
    public IBinder onBind(Intent intent) {
        Log.e("HonService","onBind");
       return new MyBinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("HonService","onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e("HonService","onStartCommand");
        return super.onStartCommand(intent, flags, startId);

    }

    @Override
    public void onDestroy() {
        Log.e("HonService","onDestroy");
        super.onDestroy();
    }

注意:这里有个坑会导致自己创建service无法导入定义的aidl文件接口.

解决办法如下:

在module即带编译版本的build.gradle加上如下,用来给AS指路.

sourceSets {
        main {
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java.srcDirs = ['src/main/java', 'src/main/aidl']
            resources.srcDirs = ['src/main/java', 'src/main/aidl']
            aidl.srcDirs = ['src/main/aidl']
            res.srcDirs = ['src/main/res']
            assets.srcDirs = ['src/main/assets']
        }
    }

 注意:做完这步记得Make project

到此服务端apk初步搞定.

二.客户端

新建module或者项目,参照服务端aidl,最好直接拷贝过来,要一一对应.

 

其实客户端这边只需要绑定服务端service即可,核心代码如下:

//用来开启服务端service
   Intent mIntent = new Intent(Intent.ACTION_MAIN);
        ComponentName componentName = new ComponentName(
                "包名",
                "对应服务类名");
        mIntent.setComponent(componentName);
   
      boolean result =  bindService(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE);

private myhonaidl its;//导包和服务端相同

private ServiceConnection mServiceConnection =new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            Log.e("MainActivity","=====onServiceConnected===");
            its=myhonaidl.Stub.asInterface(iBinder);
            try {
                String test=its.getInfo("xxx");
               
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            Log.e("MainActivity","=====onServiceDisconnected===");
        }
    };

注意:targetSdk 版本为30的时候,在Android11 的机型上,AIDL完全不可用,服务也连接不上,但是在低版本的手机上,或者targetSdk 29时候可以用.

解决办法:在清单文件添加对应根节点

 <queries>
        <package android:name="需要开启服务的apk包名" />
   </queries>

管理软件包可见性  |  Android 开发者  |  Android Developers //官方API参考

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android利用AIDL实现apk之间跨进程通信 的相关文章

  • 在 Jetpack Compose 中启动动画矢量 Drawable

    我有一个动画矢量可绘制R drawable my anim 我想在 Jetpack Compose 中展示并开始 可绘制对象显示 渲染正确 但动画未启动 这是撰写视图 Composable fun SplashView Surface mo
  • 无法理解 Java 地图条目集

    我正在看一个 java 刽子手游戏 https github com leleah EvilHangman blob master EvilHangman java https github com leleah EvilHangman b
  • 序列化对象以进行单元测试

    假设在单元测试中我需要一个对象 其中所有 50 个字段都设置了一些值 我不想手动设置所有这些字段 因为这需要时间而且很烦人 不知何故 我需要获得一个实例 其中所有字段都由一些非空值初始化 我有一个想法 如果我要调试一些代码 在某个时候我会得
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • Android构建apk:控制MANIFEST.MF

    Android 构建 APK 假设一个 apk 包含一个库 jar 例如 foo jar 该库具有 META INF MANIFEST MF 这对于它的运行很重要 但在APK中有一个包含签名数据的MANIFEST MF 并且lib jar
  • 如何在 JFreeChart TimeSeries 图表上显示降雨指数和温度?

    目前 我的 TimeSeries 图表每 2 秒显示一个位置的温度 现在 如果我想每2秒显示一次降雨指数和温度 我该如何实现呢 这是我的代码 import testWeatherService TestWeatherTimeLapseSer
  • Android Webview 图像未加载

    我制作了一个简单的应用程序WebView 但有些图片无法加载 正确 在我的电脑上 错误 在模拟器中 Correct 错误 没有横幅 于是我用Chrome debug进行调试 发现我的代码被改变了 我不添加像noscript or style
  • 尝试使用 Ruby Java Bridge (RJB) gem 时出现错误“无法创建 Java VM”

    我正在尝试实现 Ruby Java Bridge RJB gem 来与 JVM 通信 以便我可以运行 Open NLP gem 我在 Windows 8 上安装并运行了 Java 所有迹象 至少我所知道的 都表明 Java 已安装并可运行
  • 如何创建像谷歌位置历史记录一样的Android时间轴视图?

    我想设计像谷歌位置历史这样的用户界面 我必须为我正在使用的应用程序复制此 UIRecyclerView 每行都是水平的LinearLayout其中包含右侧的图标 线条和视图 该线是一个FrameLayout具有圆形背景和半透明圆圈Views
  • 使用 AWS Java SDK 为现有 S3 对象设置 Expires 标头

    我正在更新 Amazon S3 存储桶中的现有对象以设置一些元数据 我想设置 HTTPExpires每个对象的标头以更好地处理 HTTP 1 0 客户端 我们正在使用AWS Java SDK http aws amazon com sdkf
  • Android 设备上的静默安装

    我已经接受了一段时间了 在 Android 上静默安装应用程序是不可能的 也就是说 让程序安装捆绑为 APK 的应用程序 而不提供标准操作系统安装提示并完成应用程序安装程序活动 但现在我已经拿到了 Appbrain 快速网络安装程序的副本
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • 当手机旋转(方向改变)时如何最好地重新创建标记/折线

    背景 开发一个使用 Android Google Map v2 的本机 Android 应用程序 使用android support v4 app FragmentActivity 在 Android v2 2 上运行 客观的 在更改手机方
  • Android 如何聚焦当前位置

    您好 我有一个 Android 应用程序 可以在谷歌地图上找到您的位置 但是当我启动该应用程序时 它从非洲开始 而不是在我当前的城市 国家 位置等 我已经在developer android com上检查了信息与位置问题有关 但问题仍然存在
  • 如何配置eclipse以保持这种代码格式?

    以下代码来自 playframework 2 0 的示例 Display the dashboard public static Result index return ok dashboard render Project findInv
  • 用于推送通知的设备令牌

    我正在实施推送通知服务 我需要创建一个数据库来存储 4 个移动平台的所有设备令牌 我想根据他们的平台 iOS Android BlackBerry WP7 来组织它们 但是有什么方法可以区分平台 这样如果我只想向 Android 用户发送消
  • com.jcraft.jsch.JSchException:身份验证失败

    当我从本地磁盘上传文件到远程服务器时 出现这样的异常 com jcraft jsch JSchException Auth fail at org apache tools ant taskdefs optional ssh Scp exe
  • 在webview android中加载本地html文件

    我正在尝试在 android 的 webview 中加载 html 文件的内容 但是 它给了我 网页不可用错误 如果我尝试使用谷歌或雅虎等网站 它们就会起作用 html文件位于src gt main gt assests gt index
  • JAVA - 如何从扫描仪读取文件中检测到“\n”字符

    第一次海报 我在读取文本文件的扫描仪中读取返回字符时遇到问题 正在读取的文本文件如下所示 test txt start 2 0 30 30 1 1 90 30 0 test txt end 第一行 2 表示两个点 第二行 位置索引 0 xp
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是

随机推荐

  • MATLAB的曲线拟合

    原文地址 MATLAB的曲线拟合 作者 睿吉jerry MATLAB软件提供了基本的曲线拟合函数的命令 曲线拟合就是计算出两组数据之间的一种函数关系 由此可描绘其变化曲线及估计非采集数据对应的变量信息 1 线性拟合函数 regress 调用
  • 智能合约简介

    链客 专为开发者而生 有问必答 此文章来自区块链技术社区 未经允许拒绝转载 当人们在讨论智能合约的时候他们到底在说什么 在区块链和加密货币的语境中 智能合约的定义是 在分布式存储平台 例如区块链 上存储并复制的 在计算机网络 通常是运行区块
  • 【qiankun】子应用的路由信息传给主应用,主应用使用this.$router.push跳转子应用页面

    前提 已经安装qiankun 并且子应用已经接入主应用 场景 主应用是vue2 子应用是vue3 子应用的路由文件router index ts 在这段后面加下列代码 const router createRouter history cr
  • VMware Workstation 无法连接到虚拟机。请确保您有权运行该程序、访问该程序使用的所有目录以及访问所有临时文件目录的解决方法

    VMware Workstation 无法连接到虚拟机 请确保您有权运行该程序 访问该程序使用的所有目录以及访问所有临时文件目录 这个问题刚刚用虚拟机的人可能会经常遇到 解决方法就是 在开始中搜索服务 点击服务正在本电脑运行 注意 这里演示
  • CloudCompare 二次开发(5)——非插件中的PCL环境配置(均匀采样为例)

    目录 一 概述 二 CMakeLists txt 三 源码编译 四 代码示例 五 结果展示 本文由CSDN点云侠原创 原文链接 爬虫网站自重 一 概述 在进行CloudCompare二次开发的时候 可以直接在CloudCompare的核心功
  • 推动政府数字化转型进入新阶段

    推动政府数字化转型进入新阶段 公司近两年比较关注数字化转型和金融科技 打算今年重点了解一下 在网上看到了一个文章 感觉还不错 转载到这里 本文转自人民政协网上的 推动政府数字化转型进入新阶段 1 国家政策 国务院近日发布的 十四五 数字经济
  • 智慧城市智慧零售受益于5G和AI双核驱动

    支付宝推出了刷脸支付 我们只需要对准摄像头让它把我们脸部的特征完全识别出来 然后就可以进行支付了 那么这种人脸支付会用在很多地方 很简单 我们去超市购物的时候 以往你要么用卡要么给现金 或者你掏出手机来支付 但是怎么也得输入密码或者按指纹
  • MySQL自增主键详解

    一 自增值保存在哪儿 不同的引擎对于自增值的保存策略不同 1 MyISAM引擎的自增值保存在数据文件中 2 InnoDB引擎的自增值 在MySQL5 7及之前的版本 自增值保存在内存里 并没有持久化 每次重启后 第一次打开表的时候 都会去找
  • chrome浏览器:您的连接不是私密连接,burp抓包

    问题 您的连接不是私密连接 处理 简简单单 跟着我来没错 不要浪费时间再找了 插件设置 SwitchyOmega 开启代理访问http burp CA下载证书 chrome flags Allow invalid certificates
  • 第3章 数据库结构设计

    3 1数据库概念设计 数据库概念设计主要解决数据需求 即如何准确地理解数据需求 真实地把应用领域中要处理的数据组织 定义描述清楚 以支持数据库设计后续阶段的工作 3 1 1概念设计的任务 数据库概念设计阶段的目标是 1 定义和描述应用领域涉
  • 2024王道数据结构P17No11

    一个长度为L L gt 1 的升序序列S 处在第L 2位置 向下取整 的数称为S的中位数 例如 序列S1 11 13 15 17 19 则中位数为15 两个序列的中位数是含他们所有元素的升序序列的中位数 例如 S2 2 4 6 8 20 则
  • 【毕业设计】深度学习身份证识别系统 - 机器视觉 python

    文章目录 0 前言 1 实现方法 1 1 原理 1 1 1 字符定位 1 1 2 字符识别 1 1 3 深度学习算法介绍 1 1 4 模型选择 2 算法流程 3 部分关键代码 4 效果展示 5 最后 0 前言 Hi 大家好 这里是丹成学长的
  • 学习总结7.1 Linux Rsh服务器

    在线安装是指不需要用户亲自下对应软件的包 但是需要对应系统能够访问互联网 不同的Linux系统使用不同的工具进行在线安装软件 常见的在线安装软件的工具如下所示 Ubuntu Debian系统使用apt get进行在线安装软件 Redhat
  • 动态粒子爱心,表白神器源码

    效果 https www douyin com user self modal id 7187722820967763237 源码 from tkinter import from matplotlib import pyplot as p
  • FCN的代码解读

    目录 模型初始化 VGG初始化 FCN初始化 图片的预处理 图片处理 图片编码 计算相关参数 模型训练 一个小问题 完整代码 参考 最近浅研究了一下关于图像领域的图像分割的相关知识 发现水还是挺深的 因为FCN差不多也是领域的开山鼻祖 所以
  • Android无线网络调试手机

    adb tcpip 5555 adb下载地址 http download clockworkmod com test UniversalAdbDriverSetup msi 3 在设备中下载超级终端 是andriod软件 设置端口 su s
  • JVM笔记-黑马-1

    文章目录 视频资源地址 笔记资源地址 我的笔记 1 什么是JVM 2 学习jvm的作用 3 常见的jvm 4 学习路线 5 内存结构 程序计数器 作用 6 内存结构 程序计数器 特点 7 内存结构 虚拟机栈 8 内存结构 虚拟机栈的演示 9
  • C++文件操作和文件流

    C 文件操作和文件流 1文件的概念 2 文件流的分类 2 打开文件 2 1 通过类对象调用 open 函数打开一个文件 2 2 通过类对象构造函数打开文件 3 关闭文件 4 读写文件 4 1 文本文件的读写 4 2 二进制文件的读写 1文件
  • ESP8266之AT指令

    一 8266作为client 1 AT 功能 测试8266能否工作 2 AT CWMODE 3 功能 设置工作模式 1 station模式 2 ap模式 3 ap station复位保存当前值 3 AT RST 功能 复位 4 AT CWL
  • Android利用AIDL实现apk之间跨进程通信

    AIDL 最广泛与最简单的应用是与四大组件之一 Serivce 的配合使用了 我们都知道 启动一个 Serivce 有两种方式 1 通过 startService 的方式 2 通过 bindService 的方式 通过 binService