平台桥接用于客户端(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. ORACLE SQL中执行先后次序的问题

    分享一个经验 需求:Oracle中,根据COST优先级取最优先的一条记录脚本: select ... from ... where ... and rownum=1 order by cost 实际不 ...

  2. 手把手教你如何给 Docker 开启 IPv6 网络支持

    Docker 默认是不开启 IPv6 支持的,但是我们某些业务往往又需要 IPv6 的支持,特别是 IPv6 普及大势所趋,本文主要介绍的是如何开启 Docker 桥接网络 IPv6 支持,这篇文章具 ...

  3. 使用ssh连接virtual Box里的虚拟机

    使用ssh连接virtual Box里的虚拟机 需求:virtual Box提供的文件拖放功能在从虚拟机拖向主机时,会出现一些卡顿,因此考虑使用ssh代替其文件传输功能. 高级 -> 端口转发 ...

  4. 开发app步骤总结

    以下是用IDEA后端Java开发(如Spring Boot)与Android Studio前端开发app的逻辑实现步骤详解: 一.技术选择 通信协议:推荐使用RESTful API(HTTP/HTTP ...

  5. 【集合分组利器】Java通用集合分组方案

    Java通用集合分组实现方案详解:从基础到高级实践 在Java开发中,对集合中的元素按照特定属性进行分组是一项常见而重要的操作.本文将全面介绍Java中实现集合分组的多种方案,从基础实现到高级用法,并 ...

  6. Go语言实现1024终端游戏-不到400行代码

    先放源码地址,喜欢看源码翻源码,喜欢看文章的继续继续看文章 https://github.com/taadis/go1024 - go1024 使用 go 语言实现的 1024 终端游戏,不到400行 ...

  7. AI团队比单打独斗强!CrewAI多智能体协作系统开发踩坑全解析

    AI团队比单打独斗强!CrewAI多智能体协作系统开发踩坑全解析 阅读时间: 5分钟 | 字数: 1500+ "你是否曾为单个大模型难以解决复杂专业问题而苦恼?是否想过,如果能像组建专业团队 ...

  8. 🎀chrome-网页gif截图插件

    简介 本文介绍网页中gif截图工具使用,便于日常对网页中动态效果或元素进行截图 软件介绍 Capture to a Gif 是用来录制屏幕并将其保存为 GIF 格式文件的chrome插件工具.它允许用 ...

  9. Asp.net mvc基础(二)Controller给View传递数据的方式

    1.ViewData传值 步骤一:通过在控制器中以键值对的形式进行赋值 ViewData["键"] = 值 赋值: 调用: 2.ViewBag传值 ViewBag是dynamic类 ...

  10. eolinker响应预处理:接口延时执行下一步的方法

    后置代码内加入如下代码: function sleep(milliSeconds){ var startTime = new Date().getTime(); // get the current ...