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);
}
});
}
}
ArkUI-X与Android桥接通信之方法回调的更多相关文章
- 【Arduino】开发入门【十】Arduino蓝牙模块与Android实现通信
[Arduino]开发入门[十]蓝牙模块 首先show一下新入手的蓝牙模块 蓝牙参数特点 1.蓝牙核心模块使用HC-06从模块,引出接口包括VCC,GND,TXD,RXD,预留LED状态输出脚,单片机 ...
- Docker 配置固定IP及桥接的实现方法(转载)
这篇文章主要介绍了Docker 配置固定IP和桥接的实现方法的相关资料,这里详细介绍了Docker 的四种网络模式及如何实现桥接的案例,需要的朋友可以参考下 docker默认使用bridge模式,通过 ...
- AllJoyn+Android开发案例-android跨设备调用方法
AllJoyn+Android开发案例-android跨设备调用方法 项目须要涉及AllJoyn开源物联网框架.前面主要了解了一些AllJoyn主要的概念.像总线,总线附件,总线对象,总线接口这种概念 ...
- Android Socket通信详解
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客 ...
- android IPC通信(上)-sharedUserId&&Messenger
看了一本书,上面有一章解说了IPC(Inter-Process Communication,进程间通信)通信.决定结合曾经的一篇博客android 两个应用之间的通信与调用和自己的理解来好好整理总结一 ...
- Android近场通信---NFC基础转)
Android近场通信---NFC基础(一)(转) 本文介绍在Android系通过你所能执行的基本任务。它解释了如何用NDEF消息格式来发送和接收NFC数据,并且介绍了支持这些功能的Android框架 ...
- Android Socket 通信
Android socket 通信 安卓编写Socket客户端,实现连接Socket服务端通信. 创建Socket连接并获取服务端数据 先创建几个全局变量吧 private BufferedWrite ...
- 【Android】一种提高Android应用进程存活率新方法
[Android]一种提高Android应用进程存活率新方法 SkySeraph Jun. 19st 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph ...
- Android经典完美退出方法
Android经典完美退出方法,使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activit ...
- Android获取系统时间方法的总结
Android获取系统时间方法的方法有很多种,常用的有Calendar.Date.currentTimeMills等方法. (1)Calendar Calendar获取系统时间首先要用Calendar ...
随机推荐
- MySQL超大表删除数据过程
背景 笔者在公司负责公司的OpenAPI应用,估产生了调用审计的需求.对于存储这些AccessLog,虽然业界有很合适的架构和理论,奈何我司已成本优先,且作为toB的项目,调用量并不算特别大,每天也就 ...
- docker login harbor x509: certificate signed by unknown authority
前言 docker login harbor x509: certificate signed by unknown authority 解决 打开 /etc/docker/daemon.json,如 ...
- Laravel 配置连接多个数据库以及如何使用
目录 配置连接 配置 .env 文件 配置 \config\database.php 文件 使用 Schema Query Eloquent 配置连接 配置 .env 文件 /* 这部分是默认的数据库 ...
- 如何设置家用威联通 NAS UPS 断电后自动关机并通知其他设备?
场景 备注: 求轻喷, 求放过. 我真的是个理线方面的白痴. 这已经是我的极限了. 我的家庭实验室 Homelab 服务器集群配置如下. 上半部分之前已经介绍过了, 这里就不再赘述了. 今天重点介绍介 ...
- Zotero设置
1. 说明 Zotero 中文社区 | 百度网盘 使用 zotero 仅同步题录信息,使用其他云同步程序同步文献的附件,此处以坚果云为例进行演示,前期的坚果云同步设置参考文章:Zotero坚果云同步. ...
- Linux脚本-自动ping网址列表
背景 公司某一项业务需要管理多种类硬件,有一些硬件的管理功能没有实现前台展示,检测和硬件之间的网络连接状况需要通过ping每个ip地址来单独实现.在需要大规模调试网络的时候,每个硬件单独ping就显得 ...
- while循环、dowhile循环、三种循环的区别
1.while循环 案例:使用while循环,打印出水仙花数 while执行流程: 1.先执行初始化语句 2.执行判断条件 结果为true,则执行第3步 结果为false,循环结束 3.执行循环体语句 ...
- 【Linux】3.11 包管理工具(RPM和YUM)
包管理工具 1. RPM包 RPM:RedHat Package Manager,红帽软件包管理工具. Linuxd分发版本都有采用(suse,redhat,centos等) 1.1 rpm指令 1. ...
- 【服务器】Nodejs在局域网配置https访问
[服务器]Node.js在局域网配置https访问 零.需求: 做一个局域网WebRTC视频聊天系统,需要用到HTTPS.因此,配置Node.js使其支持HTTPS访问. 一.解决 在线生成和证书 访 ...
- ChirpStack 设备连通性测试极简工具
一.工具简介 你是否为调试 ChirpStack 设备数据连通性而烦恼?是否希望快速验证数据解析逻辑而无需复杂部署?这个 ChirpStack 数据连通性测试工具,算是一个极简解决方案! 无论是 Ch ...