鸿蒙组件间通信是HarmonyOS开发中的重要部分,它涉及到如何在不同组件(如Ability、UI组件等)之间传递数据和信息。鸿蒙系统提供了多种通信方式,包括本地通信和分布式通信。本文将详细介绍几种常见的鸿蒙组件间通信方法,并对每种方法的适用场景和技术实现进行解析。
Intent 是鸿蒙系统中最基本的组件间通信方式之一,用于启动 Ability 或传递简单的数据。通过 Intent,可以指定目标 Ability 并携带一些键值对数据。
Intent
对象。setParam
方法添加参数。startAbility
方法启动目标 Ability。// 创建 Intent 对象
Intent intent = new Intent();
// 设置目标 Ability 名称
intent.setTargetAbility("com.example.SecondAbility");
// 添加参数
intent.setParam("key", "value");
// 启动目标 Ability
startAbility(intent);
Data Ability 是一种专门用于数据访问的组件,类似于 Android 中的 Content Provider。它可以提供对数据库、文件或其他数据源的访问接口。
DataAbilityHelper
的类。query
、insert
、update
和 delete
等方法。DataAbilityHelper
访问 Data Ability。// 创建 DataAbilityHelper 对象
DataAbilityHelper helper = DataAbilityHelper.creator(this);
// 查询数据
ResultSet resultSet = helper.query(Uri.parse("dataability://com.example.MyDataAbility"), null, null);
while (resultSet.goToNextRow()) {
String value = resultSet.getString(0);
HiLog.info(LABEL_LOG, "Query result: %s", value);
}
EventRunner 和 Handler 是用于在同一个线程或不同线程之间传递消息的机制。它们适用于需要异步处理的任务。
EventRunner
。Handler
并绑定到 EventRunner
。postTask
或 postDelayedTask
发送任务。// 获取 EventRunner
EventRunner eventRunner = getAbilityThread().getMainEventRunner();
// 创建 Handler
Handler handler = new Handler(eventRunner);
// 发送任务
handler.postTask(() -> {
HiLog.info(LABEL_LOG, "This task is running in the main thread.");
});
DDM 是鸿蒙系统提供的分布式数据管理框架,允许设备之间共享数据。它特别适合跨设备的组件间通信。
// 初始化 DDM 数据库
DistributedDataManager manager = DistributedDataManager.getDataManager();
StoreConfig config = StoreConfig.newLocalDatabase("my_database");
DistributedKVManager kvManager = manager.getKVManager(config);
// 写入数据
kvManager.putString("key", "value", new PutCallback() {
@Override
public void onComplete(int i) {
HiLog.info(LABEL_LOG, "Data written successfully.");
}
});
// 读取数据
kvManager.getString("key", new GetCallback<String>() {
@Override
public void onGet(int i, String s) {
HiLog.info(LABEL_LOG, "Read data: %s", s);
}
});
Bundle 和 Parcelable 是用于序列化和反序列化对象的工具,常用于在组件间传递复杂数据结构。
Parcelable
接口的类。Bundle
将对象打包。// 定义 Parcelable 类
public class User implements Parcelable {
private String name;
private int age;
// 必须实现的方法
public User(Parcel in) {
name = in.readString();
age = in.readInt();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
return new User(in);
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
}
// 使用 Bundle 传递对象
Bundle bundle = new Bundle();
User user = new User();
user.name = "John";
user.age = 25;
bundle.putParcelable("user", user);
Intent intent = new Intent();
intent.putBundle("data", bundle);
startAbility(intent);
Message 和 Remote Object 是用于实现进程间通信(IPC)的高级方式。它们适合复杂的跨进程通信需求。
IRemoteBroker
的接口。RemoteObject
和 RemoteProxy
进行通信。// 定义 IRemoteBroker 接口
public interface MyService extends IRemoteBroker {
void sendMessage(String message);
}
// 实现接口
public class MyServiceImpl extends RemoteObject implements MyService {
@Override
public void sendMessage(String message) {
HiLog.info(LABEL_LOG, "Received message: %s", message);
}
}
// 使用 RemoteProxy 调用服务
MyService service = (MyService) RemoteObject.fetchObject(token);
service.sendMessage("Hello from client");