当前位置: 首页 > article >正文

实现uniapp开发安卓应用使用AIDL与原生安卓通信

前言

最近公司有开发原生插件,让uniapp与原生安卓使用AIDL通信的需求,奈何本人是原生开发,没有接触过uniapp啊,遂学,从官方文档到百度各种搜索,大约三天时间终于调通,属予作文以记之~

技术前提 要有一定的原生安卓及AIDL开发经验,不至于你会看懵逼。

开始


相关资料:
官方Android 插件开发教程

uniapp Android 原生插件开发(Module 扩展为例·2022)

uniapp开发者中心

重点看 uniapp Android 原生插件开发(Module 扩展为例·2022),因为这篇文章写的巨清晰,跟着写就行,但是有几个步骤需要注意下(你先看完上面链接文章再来看下面的内容,以下内容为链接文章的拓展):

  1. 在配置本地插件包时,package.json 文件要与 android 文件夹在同一目录下,不然会找不到本地插件。
  2. 自定义基座的选择移到了下图这个地方:
    在这里插入图片描述
  3. 每次更换插件,好像要重新制作本地基座,不然会不生效。

原本正常情况下,是一个应用暴露出AIDL接口,该接口打称.arr包,供其他应用使用,但是我们编写的插件根本上也是一个.arr包,当你把一个子模块打包成 AAR 时,任何本地 .aar 文件的依赖不会被自动包含在最终生成的 AAR 文件中。这是因为 AAR 本身是一个打包格式,它不会自动整合其他 AAR 文件的内容。

你在官方 UniPlugin-Hello-AS 项目中调试中可以随便引入,可以正常运行,但是你生成插件后,放到uniapp中,就会报错找不到相关类。

既然不能引入AAR 文件,那么按上面链接,创建好新的安卓libary 后,按照安卓规范,就在libary 中编写AIDL相关文件夹及文件:
在这里插入图片描述
这里创建的插件为扩展 Module,也就是上图中 TestModule 类继承了 UniModuleuniapp调用原生的方式为方法调用,但是你进行AIDL通信时,又必须先绑定服务,因为没有找到类似安卓Application的入口,就在 TestModule 中进行了初始化,也可以单独写个方法进行初始化。

以下代码为,一般的安卓绑定aidl远程服务方式,AIDLUtil 内封装了一些相关方法,可以不用在意。

public class TestModule extends UniModule {

    private AIDLUtil.BaseServiceConnection serviceConnection = new AIDLUtil.BaseServiceConnection();

    private boolean isBind = false;

    private void setAIDLServer() {
    
            Intent intent = new Intent(AidlConstants.ACTION_BASE_SERVICE);
            intent.setPackage(AidlConstants.PACKAGE_BASE_SERVICE);
            isBind = mUniSDKInstance.getContext().getApplicationContext().bindService(intent, serviceConnection, BIND_AUTO_CREATE);
            Log.i("TestModule", "setAIDLServer: " + isBind);

            new Thread(() -> {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

                AIDLUtil.request(100);//通过aidl通信的方法
            }).start();
        
    }

    @UniJSMethod(uiThread = true)
    public void sayHi(String name, UniJSCallback jsCallback) {
        Log.i("TestModule", "sayHi4: " + name );

        if (!isBind) {
            setAIDLServer();
        }
        if (jsCallback != null) {
            JSONObject result = new JSONObject();
            try {
                result.put("re", "Hi~4 "+name);
            } catch (JSONException e) {
                throw new RuntimeException(e);
            }
            Log.i("TestModule", "sayHi4: " + result);
            jsCallback.invoke(result);
        }
    }
}

按照上面方法,将插件制作完毕后,放到 uniapp 的 nativeplugins 目录下,注意,更新插件时要重新制作基座,修改插件名时 var plugin = uni.requireNativePlugin("test") 代码中请求的插件名别忘改了。

至此,你就可以愉快地使用uniapp的插件通过AIDL方式调用安卓原生代码了。

最后


在开发中遇到任何问题,请仔细对照上面链接步骤进行操作,官方文档还没有他的清晰。


http://www.kler.cn/a/414388.html

相关文章:

  • Linux(ubuntu)系统的一些基本操作和命令(持续更新)
  • 挑战用React封装100个组件【001】
  • Linux 内核 调用堆栈打印函数
  • 重塑用户体验!快手电商智能巡检平台的实践与探索
  • shell脚本基础学习_总结篇(完结)
  • 打开windows 的字符映射表
  • 《C++ 与神经网络:自动微分在反向传播中的高效实现之道》
  • jenkins 2.346.1最后一个支持java8的版本搭建
  • git的简单使用与gdb
  • LVGL加载器,led和列表学习(基于正点原子)
  • Django websocket 进行实时通信(消费者)
  • 第32周:猴痘病识别(Tensorflow实战第四周)
  • GitLab历史演进
  • 组成无重复数字的三位数
  • 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。-多语言
  • 第02章 使用VMware部署CENTOS系统
  • SqlServer强制转换函数TRY_CONVERT和TRY_CAST
  • “小bug”示例
  • 一款现代化的轻量级跨平台Redis桌面客户端
  • 大数据机器学习算法与计算机视觉应用05:乘法权重算法
  • 【第十二课】Rust并发编程(三)
  • NodeFormer:一种用于节点分类的可扩展图结构学习 Transformer
  • 修改element UI el-table背景颜色样式 input select date vuetree
  • 如何在 IIS 上部署 .NET Core 应用程序 ?
  • 基于 Flask 和 Socket.IO 的 WebSocket 实时数据更新实现
  • 常用Python集成开发环境(IDE)