写点什么

ArkUI-X 与 Android 桥接通信之方法回调

作者:龙儿筝
  • 2025-06-08
    湖北
  • 本文字数:4519 字

    阅读完需:约 15 分钟

平台桥接用于客户端(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);}
@Overridepublic void onSuccess(Object o) {}
@Overridepublic void onError(String s, int i, String s1) {}
@Overridepublic void onMethodCancel(String s) {}
复制代码

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

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


// xxx.etsfunction 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.etsfunction 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@Componentstruct 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.javapackage 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); } }); }}
复制代码


用户头像

龙儿筝

关注

还未添加个人签名 2024-10-27 加入

还未添加个人简介

评论

发布
暂无评论
ArkUI-X与Android桥接通信之方法回调_龙儿筝_InfoQ写作社区