找回密码
 立即注册
首页 业界区 业界 ArkUI-X与Android桥接通信之方法回调

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

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

1.在ArkUI侧调用Android侧的方法。
  1. // xxx.ets
  2. private bridgeImpl = bridge.createBridge('Bridge');
  3. this.bridgeImpl.callMethod('platformCallMethod').then((res)=>{
  4.     console.log('result: ' + res);
  5. }).catch((err: Error) => {
  6.     console.error('error: ' + JSON.stringify(err));
  7. });
复制代码
2.在Android侧实现被调用的方法。
  1. // xxx.java
  2. public String platformCallMethod() {
  3.   return "call java platformCallMethod success";
  4. }
复制代码
Android侧调用ArkUI侧的方法

1.注册ArkUI侧方法,供Android侧调用。
  1. // xxx.ets
  2. private bridgeImpl = bridge.createBridge('Bridge');
  3. private getString() : bridge.ResultValue {
  4.     return 'call js getString success';
  5. }
  6. this.bridgeImpl.registerMethod({ name: 'getString', method: this.getString });
复制代码
2.Android侧调用ArkUI侧的方法。
  1. // 方式一: 构造ArkUI侧方法描述对象实例调用
  2. Object[] paramObject = {};
  3. MethodData methodData = new MethodData("getString", paramObject);
  4. bridge.callMethod(methodData);
  5. // 方式二: ArkUI侧函数名加ArkUI侧方法形参对应的实参调用
  6. bridge.callMethod("getString");
复制代码
ArkUI侧监听Android侧的方法

1.注册ArkUI侧方法,供Android侧调用。
  1. // xxx.ets
  2. private bridgeImpl = bridge.createBridge('Bridge');
  3. private getString() : bridge.ResultValue {
  4.     return 'call js getString success';
  5. }
  6. this.bridgeImpl.registerMethod({ name: 'getString', method: this.getString });
复制代码
2.移除已注册的ArkUI侧方法。
  1. // xxx.ets
  2. bridgeImpl.unRegisterMethod('getString');
复制代码
3.在Android侧注册回调,监听方法注册、注销。
  1. // xxx.java
  2. public Bridge(Context context, String name, int id) {
  3.     super(context, name, id);
  4. }
  5. public Bridge(Context context, String name, BridgeManager bridgeManager) {
  6.     super(context, name, bridgeManager);
  7.     setMethodResultListener(this);
  8. }
  9. @Override
  10. public void onSuccess(Object o) {}
  11. @Override
  12. public void onError(String s, int i, String s1) {}
  13. @Override
  14. public void onMethodCancel(String s) {}
复制代码
ArkUI侧注册callBack且调用Android侧的方法(无参)

1.在ArkUI侧注册callBack且调用Android侧的方法。
  1. // xxx.ets
  2. function testCallBackOfJs() {
  3.   console.log("bridge js testCallBackOfJs run")
  4. }
  5. this.bridgeCodec.callMethodWithCallBack("testCallBack", testCallBackOfJs).then((res)=>{
  6.     console.log('result: ' + res);
  7. }).catch((err) => {
  8.     console.error('error: ' + JSON.stringify(err));
  9. });
复制代码
2.在Android侧实现被调用的方法,调用ArkUI侧的方法。
  1. // xxx.java
  2. public String testCallBack() {
  3.   return "call android testCallBack success";
  4. }
  5. Object[] paramObject = {};
  6. MethodData methodData = new MethodData("testCallBack", paramObject);
  7. bridge.callMethod(methodData);
复制代码
ArkUI侧注册callBack且调用Android侧的方法(有参)

1.在ArkUI侧注册callBack且调用Android侧的方法。
  1. // xxx.ets
  2. function testCallBackOfJs(stringParam) {
  3.   console.log("Js received a parameter of " + stringParam)
  4.   return "js testCallBackReturn call success."
  5. }
  6. this.bridgeCodec.callMethodWithCallBack("testCallBack", testCallBackOfJs, "js sends parameter").then((res)=>{
  7.     console.log('result: ' + res);
  8. }).catch((err) => {
  9.     console.error('error: ' + JSON.stringify(err));
  10. });
复制代码
2.在Android侧实现被调用的方法,调用ArkUI侧的方法。
  1. // xxx.java
  2. public String testCallBack(String sParam) {
  3.         ALog.i("Android received a parameter of ", sParam);
  4.     return "call android testCallBack success";
  5. }
  6. Object[] paramObject = {"android sends parameter"};
  7. MethodData methodData = new MethodData("testCallBack", paramObject);
  8. bridge.callMethod(methodData);
复制代码
callMethod不同数据类型
  1. import bridge from '@arkui-x.bridge'
  2. @Entry
  3. @Component
  4. struct Index {
  5.   @State bridgeImpl: bridge.BridgeObject = bridge.createBridge("BridgeName");
  6.   private funTest(p1: string, p2: number, p3: boolean) : bridge.ResultValue {
  7.     console.info('Java->Ts bridge funTest p1 is ' + p1);
  8.     console.info('Java->Ts bridge funTest p2 is ' + p2);
  9.     console.info('Java->Ts bridge funTest p3 is ' + p3);
  10.     return "call success"
  11.   }
  12.   private funTestArray(p1: Array<string>, p2: Array<number>, p3: Array<boolean>) : bridge.ResultValue {
  13.     console.log('Java->Ts bridge funTestArray p1 is ' + p1.toString());
  14.     console.log('Java->Ts bridge funTestArray p2 is ' + p2.toString());
  15.     console.log('Java->Ts bridge funTestArray p3 is ' + p3.toString());
  16.     return "call success"
  17.   }
  18.   private funTestRecord(p1: Record<string, string>, p2: Record<string, number>, p3: Record<string, boolean>) : bridge.ResultValue {
  19.     console.log('Java->Ts bridge funTestRecord p1 is ' + p1.toString());
  20.     console.log('Java->Ts bridge funTestRecord p2 is ' + p2.toString());
  21.     console.log('Java->Ts bridge funTestRecord p3 is ' + p3.toString());
  22.     return "call success"
  23.   }
  24.   onPageShow() {
  25.     // Register ArkUI侧 functions
  26.     this.bridgeImpl.registerMethod({name: "funTest", method: this.funTest});
  27.     this.bridgeImpl.registerMethod({name: "funTestArray", method: this.funTestArray});
  28.     this.bridgeImpl.registerMethod({name: "funTestRecord", method: this.funTestRecord});
  29.   }
  30.   build() {
  31.     Row() {
  32.       Column() {
  33.          
  34.       }
  35.       .width('100%')
  36.     }
  37.     .height('100%')
  38.   }
  39. }
复制代码
  1. // EntryEntryAbilityActivity.java
  2. package com.example.androidTestDemo;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.widget.Button;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8. import ohos.ace.adapter.capability.bridge.BridgePlugin;
  9. import ohos.ace.adapter.capability.bridge.MethodData;
  10. import ohos.stage.ability.adapter.StageActivity;
  11. public class EntryEntryAbilityActivity extends StageActivity {
  12.     private BridgeImpl bridgeImpl = null;
  13.     @Override
  14.     protected void onCreate(Bundle savedInstanceState) {
  15.         bridgeImpl = new BridgeImpl(this, "BridgeName", getBridgeManager());
  16.         setInstanceName("com.example.basebridge:entry:EntryAbility:");
  17.         super.onCreate(savedInstanceState);
  18.         // 显示应用程序界面布局(在项目的 res/layout 目录下,添加main_activity.xml文件)
  19.         setContentView(R.layout.main_activity);
  20.         // 注册按钮
  21.         testCallMethod1();
  22.         testCallMethod2();
  23.         testCallMethod3();
  24.     }
  25.    
  26.     public void testCallMethod1() {
  27.         // 使用button按钮点击,发送信息。
  28.         Button button = (Button) findViewById(R.id.TestCallMethod1);
  29.         button.setOnClickListener(new View.OnClickListener() {
  30.             @Override
  31.             public void onClick(View v) {
  32.                 // 定义对象数组,存放ArkUI侧方法形参对应的实参
  33.                 Object[] paramObject = { "param1", 1, true};
  34.                 // 方式一: 构造ArkUI侧方法描述对象实例调用
  35.                 MethodData methodData = new MethodData("funTest", paramObject);
  36.                 bridgeImpl.callMethod(methodData);
  37.                 // 方式二: ArkUI侧函数名加ArkUI侧方法形参对应的实参调用
  38.                 bridgeImpl.callMethod("funTest", "param1", 1, true);
  39.             }
  40.         });
  41.     }
  42.     public void testCallMethod2() {
  43.         // 使用button按钮点击,发送信息。
  44.         Button button = (Button) findViewById(R.id.TestCallMethod2);
  45.         button.setOnClickListener(new View.OnClickListener() {
  46.             @Override
  47.             public void onClick(View v) {
  48.                 // 定义对象数组,存放ArkUI侧方法形参对应的实参
  49.                 String[] sArray = {"hello", "world"};
  50.                 int[] iArray = {123, 456};
  51.                 boolean[] bArray = {true, false};
  52.                 Object[] paramObject = {sArray, iArray, bArray};
  53.                 // 方式一: 构造ArkUI侧方法描述对象实例调用
  54.                 MethodData methodData = new MethodData("funTestArray", paramObject);
  55.                 bridgeImpl.callMethod(methodData);
  56.                 // 方式二: ArkUI侧函数名加ArkUI侧方法形参对应的实参调用
  57.                 bridgeImpl.callMethod("funTestArray", sArray, iArray, bArray);
  58.             }
  59.         });
  60.     }
  61.     public void testCallMethod3() {
  62.         // 使用button按钮点击,发送信息。
  63.         Button button = (Button) findViewById(R.id.TestCallMethod3);
  64.         button.setOnClickListener(new View.OnClickListener() {
  65.             @Override
  66.             public void onClick(View v) {
  67.                 // 定义对象数组,存放ArkUI侧方法形参对应的实参
  68.                 Map<String, String> map1 = new HashMap<>();
  69.                 map1.put("one", "hello");
  70.                 map1.put("two", "world");
  71.                 Map<String, Integer> map2 = new HashMap<>();
  72.                 map2.put("one", 1);
  73.                 map2.put("two", 2);
  74.                 Map<String, Boolean> map3 = new HashMap<>();
  75.                 map3.put("one", true);
  76.                 map3.put("two", false);
  77.                 Object[] paramObject = {map1, map2, map3};
  78.                 // 方式一: 构造ArkUI侧方法描述对象实例调用
  79.                 MethodData methodData = new MethodData("funTestRecord", paramObject);
  80.                 bridgeImpl.callMethod(methodData);
  81.                 // 方式二: ArkUI侧函数名加ArkUI侧方法形参对应的实参调用
  82.                 bridgeImpl.callMethod("funTestRecord", map1, map2, map3);
  83.             }
  84.         });
  85.     }
  86. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册