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 ...
随机推荐
- 当你在浏览器中输入 google.com 后按下回车发生了什么?
按下"g"键 接下来的内容介绍了物理键盘和系统中断的工作原理,但是有一部分内容却没有涉及.当你按下"g"键,浏览器接收到这个消息之后,会触发自动完成机制.浏览器 ...
- NumPy学习7
今天学习了: 13, NumPy字符串处理函数 14, NumPy数学函数 15, NumPy算术运算 numpy_test7.py : import numpy as np ''' 13, NumP ...
- Redis 通用命令
KEYS 语法: KEYS pattern 功能: 返回所有匹配 pattern 的键 可以使用该命令的Redis版本: 1.0.0 时间复杂度: O(N) N指的是在数据库中的键的数量 不建议在生成 ...
- RabbitMQ 消息实现过程+事务+消息确认
服务端(生产者) 1.引用 rabbitmq 包 2.建立连接工厂 connectionfactory 3.创建 频道 createchannel 4.在频道中 绑定消息队列 5.发布basicpub ...
- MySQL-排序相关原理分析
全字段排序和rowId排序 建表语句如下: CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` ...
- static修饰成员方法、static修饰成员的特点总结、浅聊主方法-java se进阶 day01
1.工具类的介绍 工具类不是用于描述事物的类,而是帮我们完成事情的类(打工) 如图 当我们编写完这个类后,我们会发现一件事,这个类自己本身并没有意义,这个类完全是给用户进行调用方法的 既然是专门给用户 ...
- word突然无法转换latex公式的解决尝试
正常情况下我在word插入复制的latex公式步骤如下(以\(\mu\neq 10\)为例): 把\(\mu\neq 10\)粘贴到word文档中,选中\(\mu\neq 10\)并同时按下alt和等 ...
- 自动驾驶 | 为CarLA添加一辆小米SU7 Part I
自动驾驶 | 为CarLA添加一辆小米SU7 Part I 导言 什么是CarLA? CarLA是一款基于虚幻引擎4(Unreal Engine 4)构建的开源自动驾驶仿真平台,为自动驾驶算法的研发. ...
- 武汉工程大学2020GPLT选拔赛(重现赛)
L2-4 缘之空 1.使用倍增法求最近公共祖先,然后利用公共祖先计算两点的树上距离 2.但是此题并没有提供根节点,所以要先找到根节点以后才可以进行倍增法求lca /** - swj - * /> ...
- IDEA构建Maven项目生成的文件说明(.mvn、mvnw、mvnw.cmd、.gitignore、.iml、.idea、pom.xml)
IDEA构建的maven+springBoot项目结构如下: 1..gitignore:分布式版本控制系统git的配置文件,意思为忽略提交 在 .gitingore 文件中,遵循相应的语法,即在每一行 ...