HarmonyOS鸿蒙Next中练习ServiceAbility时出现连接service的问题

HarmonyOS鸿蒙Next中练习ServiceAbility时出现连接service的问题 在练习ServiceAbility的时候发现,在连接后台运行的service,打印日志表示连接成功也能进入到service返回RemoteObject对象的方法中,可是连接成功后为什么没有回调onAbilityConnectDone

以下是我的代码

pageAbility:

public class ForthAbilitySlice extends AbilitySlice {

    private DirectionalLayout myLayout = new DirectionalLayout(this);
    private Intent serviceIntent;

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_forth_layout);
        //启动FirstServiceAbility
        serviceIntent = new Intent();
        serviceIntent.setParam("test","hehhehehe");
        Operation operation = new Intent.OperationBuilder()
            .withDeviceId("")
            .withBundleName("com.example.myapplication")
            .withAbilityName("com.example.myapplication.FirstServiceAbility")
            .build();
        serviceIntent.setOperation(operation);
        startAbility(serviceIntent);
    }

    @Override
    public void onActive() {
        System.out.println("我进来了");
        Intent resultIntent = new Intent();
        resultIntent.setParam("myname","lily");
        setResult(resultIntent);
        //获取Service服务,并对Service服务进行操作
        // 创建连接回调实例
        IAbilityConnection connection = new IAbilityConnection() {
            // 连接到Service的回调
            @Override
            public void onAbilityConnectDone(ElementName elementName, IRemoteObject iRemoteObject, int resultCode) {
                // 在这里开发者可以拿到服务端传过来IRemoteObject对象,从中解析出服务端传过来的信息
                System.out.println("我拿到了IRemoteObject对象了么-------:"+iRemoteObject);
                String interfaceDescriptor = iRemoteObject.getInterfaceDescriptor();
            }

            // 断开与连接的回调
            @Override
            public void onAbilityDisconnectDone(ElementName elementName, int resultCode) {
                System.out.println("我断开了链接");
            }
        };
        // 连接Service
        System.out.println("****connection:"+connection);
        boolean flag = connectAbility(serviceIntent, connection);
        System.out.println("我是否已经链接上了service:"+flag);
        //回退按钮
        Button backButton=(Button) findComponentById(ResourceTable.Id_back_button);
        backButton.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                System.out.println("我回退了");
            }
        });
        //播放按钮
        Button palyButton=(Button) findComponentById(ResourceTable.Id_paly_button);
        palyButton.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                System.out.println("我播放了");
            }
        });
        //前进按钮
        Button goonButton=(Button) findComponentById(ResourceTable.Id_goon_button);
        goonButton.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                System.out.println("我前进了");
            }
        });
    }

    @Override
    protected void onBackPressed() {
        System.out.println("我点击了返回按钮");
        setResult(new Intent().setParam("myname","lilay"));
        super.onBackPressed();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }
}

ServiceAblility:

public class FirstServiceAbility extends Ability {

    private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, "Demo");

    @Override
    public void onStart(Intent intent) {
        HiLog.error(LABEL_LOG, "FirstServiceAbility::onStart");
        HiLog.info(LABEL_LOG, "info-FirstServiceAbility::onStart");
        HiLog.debug(LABEL_LOG, "debug-FirstServiceAbility::onStart");
        System.out.println("我进入到了Service");
        System.out.println("传进来intent的对象:"+intent);
        super.onStart(intent);
    }

    @Override
    public void onBackground() {
        super.onBackground();
        HiLog.info(LABEL_LOG, "FirstServiceAbility::onBackground");
    }

    @Override
    public void onStop() {
        super.onStop();
        HiLog.info(LABEL_LOG, "FirstServiceAbility::onStop");
    }

    @Override
    public void onCommand(Intent intent, boolean restart, int startId) {
    }

    @Override
    public IRemoteObject onConnect(Intent intent) {
        System.out.println("进入到了IRemote的对象中");
        super.onConnect(intent);
        return new MyRemoteObject();
    }

    @Override
    public void onDisconnect(Intent intent) {
        super.onDisconnect(intent);
    }
}

更多关于HarmonyOS鸿蒙Next中练习ServiceAbility时出现连接service的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

15 回复

我也遇到了,好像真机就没问题,模拟器就收不到

更多关于HarmonyOS鸿蒙Next中练习ServiceAbility时出现连接service的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我也遇到同样的问题,琢磨以一天,以为啥地方搞错了,浪费时间。

您好,请问这个后来是怎么解决的?

HarmonyOS的流畅动画和过渡效果让操作更加顺畅,体验极佳。

图片

打印中已经显示连接成功,不知道为什么连接成功后的回调没有执行。

您好,请问这个问题后来是怎么解决的?我也遇到了类似的问题

后来我就没学习了!

  1. Service需要在应用清单文件中进行注册,注册类型type需要设置为service

  2. 通过Intent的setElement()来设置目标服务信息,ElementName的构造方法共接收三个参数:第一个参数为设备Id,如果是本地设备则可以直接留空;第二个参数为包名称;第三个参数为目标Ability。

Intent intent = new Intent();
ElementName localElement = new ElementName("", "com.example.myapplication", "FirstServiceAbility");
intent.setElement(localElement);
  1. 通过connectAbility()方法连接Service,需要传入目标Service的Intent。
private IAbilityConnection connection = new IAbilityConnection() {
    @Override
    public void onAbilityConnectDone(ElementName elementName, IRemoteObject iRemoteObject, int resultCode) {}

    @Override
    public void onAbilityDisconnectDone(ElementName elementName, int resultCode) {}
};

connectAbility(intent, connection);

版主首先很感谢您的回答,您说的这几步我都做了,效果和我上边的代码效果是一样的。我不知道为什么打印的已经连接成功了,

但是没有打印连接成功后的回调。该注册的,我也注册了,在创建ServiceAbility的时候就自动注册了。

亲爱滴开发者 ,这个问题已经在处理中啦,稍后答复你哟 ,么么哒

六水是不是就是个机器人啊,只发“问题已经处理中,稍后再答复”,我还发现了论坛这个网页应用有个bug,就是从我的消息列表中点击进入主题的时候,打不开主题,报404!注意修复一下。

冤枉啊真的有帮您反馈问题,关于您提出的建议,我们会尽快给您回复哒

看来是真人,一口飞吻送给你!顺便把我的照片发给你

照片

在HarmonyOS鸿蒙Next中练习ServiceAbility时,连接service的问题可能由以下原因引起:

  1. ServiceAbility未正确注册:确保在config.json文件中正确注册了ServiceAbility,包括nametype等字段。

  2. ServiceAbility未启动:确保ServiceAbility已经通过startAbilityconnectAbility启动。

  3. 连接参数错误:在调用connectAbility时,确保传递的Intent对象中的bundleNameabilityName与ServiceAbility的注册信息一致。

  4. 生命周期管理不当:ServiceAbility的生命周期方法如onStartonConnectonDisconnect需要正确实现,确保在连接时能够正确处理请求。

  5. 权限问题:检查config.json中的权限配置,确保应用有权限连接ServiceAbility。

  6. 回调函数未实现:确保实现了IAbilityConnection接口的回调方法,如onAbilityConnectDoneonAbilityDisconnectDone,以处理连接成功或失败的情况。

  7. 设备兼容性问题:某些设备或模拟器可能不支持ServiceAbility的某些功能,确保在支持的设备上进行测试。

  8. 日志排查:通过HiLog输出日志,检查连接过程中是否有错误信息,帮助定位问题。

以上是连接ServiceAbility时可能遇到的问题及排查方向。

在HarmonyOS鸿蒙Next中练习ServiceAbility时,若遇到连接service的问题,建议从以下几个方面排查:

  1. 检查Service声明:确保在config.json中正确声明了ServiceAbility,包括typename等配置项。
  2. 绑定Service:使用connectAbility方法绑定Service,确保传入的Intent参数正确指向目标Service。
  3. 权限配置:检查应用是否具备访问Service的权限,确保在config.json中配置了必要的reqPermissions
  4. 生命周期管理:确保ServiceAbility的生命周期方法(如onConnectonDisconnect)正确实现,并在适当时机释放资源。
  5. 日志调试:通过HiLog输出日志,检查连接过程中是否有异常信息,便于定位问题。

如果问题依旧,建议参考官方文档或社区资源,进一步排查和解决。

回到顶部