HarmonyOS 鸿蒙Next练习ServiceAbility遇到传值问题
HarmonyOS 鸿蒙Next练习ServiceAbility遇到传值问题 1、在PageAbility打开一个ServiceAbility通过intent传递参数,在ServiceAbility中获取intent对象为空,不知道是为什么?其他PageAbility之间跳转传参都没有问题,都可以正常携带参数。代码如下:
pageAbility:
ForthAbilitySlice AbilitySlice {
DirectionalLayout = DirectionalLayout();
Intent ;
onStart(Intent intent) {
.onStart(intent);
.setUIContent(ResourceTable.);
= Intent();
.setParam(,);
Operation operation = Intent.OperationBuilder()
.withDeviceId()
.withBundleName()
.withAbilityName()
.build();
.setOperation(operation);
startAbility();
}
onActive() {
System.println();
Intent resultIntent = Intent();
resultIntent.setParam(,);
setResult(resultIntent);
IAbilityConnection connection = IAbilityConnection() {
onAbilityConnectDone(ElementName elementName, IRemoteObject iRemoteObject, resultCode) {
System.println(elementName + iRemoteObject);
String interfaceDescriptor = iRemoteObject.getInterfaceDescriptor();
}
onAbilityDisconnectDone(ElementName elementName, resultCode) {
System.println();
}
};
System.println(connection);
flag = connectAbility(, connection);
System.println(flag);
Button backButton=(Button) findComponentById(ResourceTable.);
backButton.setClickedListener(Component.ClickedListener() {
onClick(Component component) {
System.println();
}
});
Button palyButton=(Button) findComponentById(ResourceTable.);
palyButton.setClickedListener(Component.ClickedListener() {
onClick(Component component) {
System.println();
}
});
Button goonButton=(Button) findComponentById(ResourceTable.);
goonButton.setClickedListener(Component.ClickedListener() {
onClick(Component component) {
System.println();
}
});
}
onBackPressed() {
System.println();
setResult(Intent().setParam(,));
.onBackPressed();
}
onForeground(Intent intent) {
.onForeground(intent);
}
}
ServiceAblility:
FirstServiceAbility Ability {
HiLogLabel = HiLogLabel(,,);
onStart(Intent intent) {
HiLog.i(,,);
HiLog.d(,,);
HiLog.w(,,);
System.println();
System.println(intent);
.onStart(intent);
}
onBackground() {
.onBackground();
HiLog.i(,,);
}
onStop() {
.onStop();
HiLog.i(,,);
}
onCommand(Intent intent, restart, startId) {
}
IRemoteObject onConnect(Intent intent) {
System.println();
.onConnect(intent);
MyRemoteObject();
}
onDisconnect(Intent intent) {
.onDisconnect(intent);
}
}
在ServiceAbility获取intent对象的时候为空,打印的日志如下:
更多关于HarmonyOS 鸿蒙Next练习ServiceAbility遇到传值问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
@eva3w 已经按照您的提示做了测试,您看一下。
更多关于HarmonyOS 鸿蒙Next练习ServiceAbility遇到传值问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
开发者您好,看了您的代码,您启动服务的方式为绑定式启动,可以试试在onCommand回调中将intent打印出来,观察是否为null
我使用了onCommand回调,但是没见有响应。我之前的代码有点出入,我把最新的代码给您贴一下。
pageSlice:
```java
com.example.myapplication.slice;
com.example.myapplication.Person;
com.example.myapplication.ResourceTable;
ohos.aafwk.ability.AbilitySlice;
ohos.aafwk.ability.IAbilityConnection;
ohos.aafwk.content.Intent;
ohos.aafwk.content.Operation;
ohos.agp.components.Button;
ohos.agp.components.Component;
ohos.agp.components.DirectionalLayout;
ohos.bundle.ElementName;
ohos.rpc.IRemoteObject;
ForthAbilitySlice Ability {
DirectionalLayout = DirectionalLayout();
Intent ;
onStart(Intent intent) {
.onStart(intent);
.setUIContent(ResourceTable.);
= Intent();
.setParam(,);
Operation operation = Intent.OperationBuilder()
.withDeviceId()
.withBundleName()
.withAbilityName()
.build();
.setOperation(operation);
startAbility();
}
onActive() {
System.println();
Intent resultIntent = Intent();
resultIntent.setParam(,);
setResult(resultIntent);
IAbilityConnection connection = IAbilityConnection() {
onAbilityConnectDone(ElementName elementName, IRemoteObject iRemoteObject, resultCode) {
System.println(elementName + iRemoteObject);
String interfaceDescriptor = iRemoteObject.getInterfaceDescriptor();
}
onAbilityDisconnectDone(ElementName elementName, resultCode) {
System.println();
}
};
System.println(connection);
flag = connectAbility(, connection);
System.println(flag);
Button backButton=(Button) findComponentById(ResourceTable.);
backButton.setClickedListener(Component.ClickedListener() {
onClick(Component component) {
System.println();
}
});
Button palyButton=(Button) findComponentById(ResourceTable.);
palyButton.setClickedListener(Component.ClickedListener() {
onClick(Component component) {
System.println();
}
});
Button goonButton=(Button) findComponentById(ResourceTable.);
goonButton.setClickedListener(Component.ClickedListener() {
onClick(Component component) {
System.println();
}
});
}
onBackPressed() {
System.println();
setResult(Intent().setParam(,));
.onBackPressed();
}
onForeground(Intent intent) {
.onForeground(intent);
}
}
serviceAbility:
com.example.myapplication;
ohos.aafwk.ability.Ability;
ohos.aafwk.content.Intent;
ohos.rpc.IRemoteObject;
ohos.hiviewdfx.HiLog;
ohos.hiviewdfx.HiLogLabel;
ohos.rpc.RemoteObject;
java.io.Serializable;
FirstServiceAbility Ability {
HiLogLabel = HiLogLabel(,,);
onStart(Intent intent) {
HiLog.error(,,);
HiLog.info(,,);
HiLog.debug(,,);
System.println();
System.println(intent);
.onStart(intent);
}
onCommand(Intent intent, restart) {
System.println(intent);
.onCommand(intent, restart);
}
onBackground() {
.onBackground();
HiLog.info(,,);
}
onStop() {
.onStop();
HiLog.info(,,);
}
onCommand(Intent intent, restart, startId) {
}
IRemoteObject onConnect(Intent intent) {
System.println();
.onConnect(intent);
RemoteObject();
}
onDisconnect(Intent intent) {
.onDisconnect(intent);
}
}
今天我又尝试了一下,使用onCommnd打印intent可以正常打印,那天是我弄错了,但是为什么onStart中打印intent就为null呢?
存在的bug啊,等后续修复
有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html
亲爱滴开发者 ,这个问题已经在处理中啦,稍后答复你哟 ,么么哒
在HarmonyOS鸿蒙Next中,ServiceAbility用于后台服务任务。传值问题可能涉及Intent或MessageParcel的使用。Intent用于启动ServiceAbility时传递数据,MessageParcel用于跨进程通信。确保在启动ServiceAbility时正确设置Intent的额外数据,并在ServiceAbility中通过onStart
或onCommand
方法获取。对于跨进程通信,使用MessageParcel进行数据序列化和反序列化。检查数据类型和序列化方法是否正确,确保数据在传递过程中不丢失或损坏。
在HarmonyOS鸿蒙Next中,ServiceAbility传值问题通常涉及Intent的使用。确保在启动ServiceAbility时,通过Intent
的setParam
方法传递参数,并在ServiceAbility中通过getParam
方法获取。例如:
// 启动ServiceAbility并传值
Intent intent = new Intent();
intent.setParam("key", "value");
startAbility(intent);
// 在ServiceAbility中获取值
String value = getParam("key");
确保键值对匹配,并检查ServiceAbility的生命周期方法(如onStart
)是否正确处理了Intent。