平台桥接用于客户端(ArkUI)和平台(Android或iOS)之间传递消息,即用于ArkUI与平台双向数据传递、ArkUI侧调用平台的方法、平台调用ArkUI侧的方法。本文主要介绍Android平台与ArkUI交互,ArkUI侧具体用法请参考Bridge API,Android侧参考BridgePlugin。

ArkUI侧调用Android侧的方法

1.在ArkUI侧调用Android侧的方法。

// xxx.ets

private bridgeImpl = bridge.createBridge('Bridge');

this.bridgeImpl.callMethod('platformCallMethod').then((res)=>{
console.log('result: ' + res);
}).catch((err: Error) => {
console.error('error: ' + JSON.stringify(err));
});

2.在Android侧实现被调用的方法。

// xxx.java

public String platformCallMethod() {
return "call java platformCallMethod success";
}

Android侧调用ArkUI侧的方法

1.注册ArkUI侧方法,供Android侧调用。

// xxx.ets

private bridgeImpl = bridge.createBridge('Bridge');
private getString() : bridge.ResultValue {
return 'call js getString success';
} this.bridgeImpl.registerMethod({ name: 'getString', method: this.getString });

2.Android侧调用ArkUI侧的方法。

// 方式一: 构造ArkUI侧方法描述对象实例调用
Object[] paramObject = {};
MethodData methodData = new MethodData("getString", paramObject);
bridge.callMethod(methodData);
// 方式二: ArkUI侧函数名加ArkUI侧方法形参对应的实参调用
bridge.callMethod("getString");

ArkUI侧监听Android侧的方法

1.注册ArkUI侧方法,供Android侧调用。

// xxx.ets

private bridgeImpl = bridge.createBridge('Bridge');
private getString() : bridge.ResultValue {
return 'call js getString success';
} this.bridgeImpl.registerMethod({ name: 'getString', method: this.getString });

2.移除已注册的ArkUI侧方法。

// xxx.ets

bridgeImpl.unRegisterMethod('getString');

3.在Android侧注册回调,监听方法注册、注销。

// xxx.java

public Bridge(Context context, String name, int id) {
super(context, name, id);
} public Bridge(Context context, String name, BridgeManager bridgeManager) {
super(context, name, bridgeManager);
setMethodResultListener(this);
} @Override
public void onSuccess(Object o) {} @Override
public void onError(String s, int i, String s1) {} @Override
public void onMethodCancel(String s) {}

ArkUI侧注册callBack且调用Android侧的方法(无参)

1.在ArkUI侧注册callBack且调用Android侧的方法。

// xxx.ets
function testCallBackOfJs() {
console.log("bridge js testCallBackOfJs run")
} this.bridgeCodec.callMethodWithCallBack("testCallBack", testCallBackOfJs).then((res)=>{
console.log('result: ' + res);
}).catch((err) => {
console.error('error: ' + JSON.stringify(err));
});

2.在Android侧实现被调用的方法,调用ArkUI侧的方法。

// xxx.java

public String testCallBack() {
return "call android testCallBack success";
} Object[] paramObject = {};
MethodData methodData = new MethodData("testCallBack", paramObject);
bridge.callMethod(methodData);

ArkUI侧注册callBack且调用Android侧的方法(有参)

1.在ArkUI侧注册callBack且调用Android侧的方法。

// xxx.ets
function testCallBackOfJs(stringParam) {
console.log("Js received a parameter of " + stringParam)
return "js testCallBackReturn call success."
} this.bridgeCodec.callMethodWithCallBack("testCallBack", testCallBackOfJs, "js sends parameter").then((res)=>{
console.log('result: ' + res);
}).catch((err) => {
console.error('error: ' + JSON.stringify(err));
});

2.在Android侧实现被调用的方法,调用ArkUI侧的方法。

// xxx.java

public String testCallBack(String sParam) {
ALog.i("Android received a parameter of ", sParam);
return "call android testCallBack success";
} Object[] paramObject = {"android sends parameter"};
MethodData methodData = new MethodData("testCallBack", paramObject);
bridge.callMethod(methodData);

callMethod不同数据类型

import bridge from '@arkui-x.bridge'

@Entry
@Component
struct Index {
@State bridgeImpl: bridge.BridgeObject = bridge.createBridge("BridgeName"); private funTest(p1: string, p2: number, p3: boolean) : bridge.ResultValue {
console.info('Java->Ts bridge funTest p1 is ' + p1);
console.info('Java->Ts bridge funTest p2 is ' + p2);
console.info('Java->Ts bridge funTest p3 is ' + p3);
return "call success"
} private funTestArray(p1: Array<string>, p2: Array<number>, p3: Array<boolean>) : bridge.ResultValue {
console.log('Java->Ts bridge funTestArray p1 is ' + p1.toString());
console.log('Java->Ts bridge funTestArray p2 is ' + p2.toString());
console.log('Java->Ts bridge funTestArray p3 is ' + p3.toString());
return "call success"
} private funTestRecord(p1: Record<string, string>, p2: Record<string, number>, p3: Record<string, boolean>) : bridge.ResultValue {
console.log('Java->Ts bridge funTestRecord p1 is ' + p1.toString());
console.log('Java->Ts bridge funTestRecord p2 is ' + p2.toString());
console.log('Java->Ts bridge funTestRecord p3 is ' + p3.toString());
return "call success"
} onPageShow() {
// Register ArkUI侧 functions
this.bridgeImpl.registerMethod({name: "funTest", method: this.funTest});
this.bridgeImpl.registerMethod({name: "funTestArray", method: this.funTestArray});
this.bridgeImpl.registerMethod({name: "funTestRecord", method: this.funTestRecord});
} build() {
Row() {
Column() { }
.width('100%')
}
.height('100%')
}
}
// EntryEntryAbilityActivity.java
package com.example.androidTestDemo; import android.os.Bundle;
import android.view.View;
import android.widget.Button; import java.util.HashMap;
import java.util.Map; import ohos.ace.adapter.capability.bridge.BridgePlugin;
import ohos.ace.adapter.capability.bridge.MethodData;
import ohos.stage.ability.adapter.StageActivity; public class EntryEntryAbilityActivity extends StageActivity {
private BridgeImpl bridgeImpl = null; @Override
protected void onCreate(Bundle savedInstanceState) {
bridgeImpl = new BridgeImpl(this, "BridgeName", getBridgeManager());
setInstanceName("com.example.basebridge:entry:EntryAbility:");
super.onCreate(savedInstanceState);
// 显示应用程序界面布局(在项目的 res/layout 目录下,添加main_activity.xml文件)
setContentView(R.layout.main_activity);
// 注册按钮
testCallMethod1();
testCallMethod2();
testCallMethod3();
} public void testCallMethod1() {
// 使用button按钮点击,发送信息。
Button button = (Button) findViewById(R.id.TestCallMethod1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 定义对象数组,存放ArkUI侧方法形参对应的实参
Object[] paramObject = { "param1", 1, true};
// 方式一: 构造ArkUI侧方法描述对象实例调用
MethodData methodData = new MethodData("funTest", paramObject);
bridgeImpl.callMethod(methodData);
// 方式二: ArkUI侧函数名加ArkUI侧方法形参对应的实参调用
bridgeImpl.callMethod("funTest", "param1", 1, true);
}
});
}
public void testCallMethod2() {
// 使用button按钮点击,发送信息。
Button button = (Button) findViewById(R.id.TestCallMethod2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 定义对象数组,存放ArkUI侧方法形参对应的实参
String[] sArray = {"hello", "world"};
int[] iArray = {123, 456};
boolean[] bArray = {true, false};
Object[] paramObject = {sArray, iArray, bArray};
// 方式一: 构造ArkUI侧方法描述对象实例调用
MethodData methodData = new MethodData("funTestArray", paramObject);
bridgeImpl.callMethod(methodData);
// 方式二: ArkUI侧函数名加ArkUI侧方法形参对应的实参调用
bridgeImpl.callMethod("funTestArray", sArray, iArray, bArray);
}
});
}
public void testCallMethod3() {
// 使用button按钮点击,发送信息。
Button button = (Button) findViewById(R.id.TestCallMethod3);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 定义对象数组,存放ArkUI侧方法形参对应的实参
Map<String, String> map1 = new HashMap<>();
map1.put("one", "hello");
map1.put("two", "world");
Map<String, Integer> map2 = new HashMap<>();
map2.put("one", 1);
map2.put("two", 2);
Map<String, Boolean> map3 = new HashMap<>();
map3.put("one", true);
map3.put("two", false); Object[] paramObject = {map1, map2, map3};
// 方式一: 构造ArkUI侧方法描述对象实例调用
MethodData methodData = new MethodData("funTestRecord", paramObject);
bridgeImpl.callMethod(methodData);
// 方式二: ArkUI侧函数名加ArkUI侧方法形参对应的实参调用
bridgeImpl.callMethod("funTestRecord", map1, map2, map3);
}
});
}
}

ArkUI-X与Android桥接通信之方法回调的更多相关文章

  1. 【Arduino】开发入门【十】Arduino蓝牙模块与Android实现通信

    [Arduino]开发入门[十]蓝牙模块 首先show一下新入手的蓝牙模块 蓝牙参数特点 1.蓝牙核心模块使用HC-06从模块,引出接口包括VCC,GND,TXD,RXD,预留LED状态输出脚,单片机 ...

  2. Docker 配置固定IP及桥接的实现方法(转载)

    这篇文章主要介绍了Docker 配置固定IP和桥接的实现方法的相关资料,这里详细介绍了Docker 的四种网络模式及如何实现桥接的案例,需要的朋友可以参考下 docker默认使用bridge模式,通过 ...

  3. AllJoyn+Android开发案例-android跨设备调用方法

    AllJoyn+Android开发案例-android跨设备调用方法 项目须要涉及AllJoyn开源物联网框架.前面主要了解了一些AllJoyn主要的概念.像总线,总线附件,总线对象,总线接口这种概念 ...

  4. Android Socket通信详解

    一.Socket通信简介  Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客 ...

  5. android IPC通信(上)-sharedUserId&amp;&amp;Messenger

    看了一本书,上面有一章解说了IPC(Inter-Process Communication,进程间通信)通信.决定结合曾经的一篇博客android 两个应用之间的通信与调用和自己的理解来好好整理总结一 ...

  6. Android近场通信---NFC基础转)

    Android近场通信---NFC基础(一)(转) 本文介绍在Android系通过你所能执行的基本任务。它解释了如何用NDEF消息格式来发送和接收NFC数据,并且介绍了支持这些功能的Android框架 ...

  7. Android Socket 通信

    Android socket 通信 安卓编写Socket客户端,实现连接Socket服务端通信. 创建Socket连接并获取服务端数据 先创建几个全局变量吧 private BufferedWrite ...

  8. 【Android】一种提高Android应用进程存活率新方法

    [Android]一种提高Android应用进程存活率新方法 SkySeraph Jun. 19st 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph ...

  9. Android经典完美退出方法

    Android经典完美退出方法,使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activit ...

  10. Android获取系统时间方法的总结

    Android获取系统时间方法的方法有很多种,常用的有Calendar.Date.currentTimeMills等方法. (1)Calendar Calendar获取系统时间首先要用Calendar ...

随机推荐

  1. HTTP 尝试获取 Client IP

    HTTP 中获取 Client IP 相关策略需求, 在当下网络环境中多数只能提供建议作用. 更多的是 通过其它唯一标识来挖掘更多潜在价值. 本文主要就一个内容, 如何最大可能尝试在 HTTP 请求中 ...

  2. Failed to start MySQL 8.0 database server.

    原因 在mysql错误日志里出现:The innodb_system data file 'ibdata1' must be writable,字面意思:ibdata1必须可写 查看日志报错,文件夹无 ...

  3. 最新活动 ISS 国际空间站 MAI-75 SSTV活动计划于2020年8月4日至5日

    MAI-75  SSTV活动计划于2020年8月4日和5日举行 8月3日至9日这一周的最后宇航员时间表最近公布了,它显示了定于8月4日和5日进行的MAI-75活动.这是在Space X Demo-2脱 ...

  4. oracle中的aix,Oracle在AIX上一些处理

    一.Oracle在aix上连接 1.su - oracle  //进入oracle用户: 2.export ORACLE_SID=house  //指定实例,多个实例的情况下: 3.sqlplus / ...

  5. QwQ-32B:用强化学习打造的AI推理黑科技 🚀

    现在就体验 QwQ-32B:https://qwq32.com AI界的新星闪耀登场 小伙伴们,AI领域又出现重大突破啦!Qwen团队最新发布的QwQ-32B模型简直太厉害了!这个只有320亿参数的模 ...

  6. tomghost打靶学习笔记(3)

    主要内容 信息收集:ajp漏洞 横向提权:在没有办法立刻提升到管理员权限时,可以试试通过横向的权限提升切换到其他用户再做提权尝试 涉及尝试了前两台靶机没有用过的枚举方法,比如SUID 使用john解码 ...

  7. Hello, PostgreSQL

    Hello, PostgreSQL Whoami:5年+金融.政府.医疗领域工作经验的DBA Certificate:PGCM.OCP.YCP Skill:Oracle.Mysql.PostgreSQ ...

  8. python操作PC版微信,给指定好友发信息(键鼠操作和复制粘贴相关库)

    主要用来"pyautogui"."pyperclip"两个模块 pyautogui 主要用于控制键盘和鼠标操作.详细参考https://blog.csdn.ne ...

  9. Netty 心跳机制实现(客户端与服务端)

    Netty 心跳机制实现(客户端与服务端) Netty 的心跳机制是保持长连接有效性的重要手段,可以检测连接是否存活并及时释放无效连接.下面介绍客户端和服务端的完整实现方案. 一.服务端实现 1. 基 ...

  10. 解决 podman 容器无法在宿主机和容器内部相互访问问题的记录

    解决 podman 容器无法在宿主机和容器内部相互访问问题的记录 近期在使用 podman 时,遇到了容器无法在宿主机和容器内部相互访问的问题.经过一番探索,参考了这篇文章,成功解决了该问题.在此,我 ...