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

9 回复
@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中通过onStartonCommand方法获取。对于跨进程通信,使用MessageParcel进行数据序列化和反序列化。检查数据类型和序列化方法是否正确,确保数据在传递过程中不丢失或损坏。

在HarmonyOS鸿蒙Next中,ServiceAbility传值问题通常涉及Intent的使用。确保在启动ServiceAbility时,通过IntentsetParam方法传递参数,并在ServiceAbility中通过getParam方法获取。例如:

// 启动ServiceAbility并传值
Intent intent = new Intent();
intent.setParam("key", "value");
startAbility(intent);

// 在ServiceAbility中获取值
String value = getParam("key");

确保键值对匹配,并检查ServiceAbility的生命周期方法(如onStart)是否正确处理了Intent。

回到顶部