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

平台桥接用于客户端(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);             }         });     } } 

发表评论

评论已关闭。

相关文章