美文网首页
Day10 鸿蒙,Ability全家桶(二)如何后台运行任务

Day10 鸿蒙,Ability全家桶(二)如何后台运行任务

作者: 程序员小小叶 | 来源:发表于2020-12-20 15:45 被阅读0次

    今天我们来聊一下Service Ability,基于Service模板的Ability(以下简称“Service”)主要用于后台运行任务(如执行音乐播放、文件下载等),但不提供用户交互界面。Service可由其他应用或Ability启动,即使用户切换到其他应用,Service仍将在后台继续运行。

    这里就不得不提到另外一个知识点,线程。

    其实目前我们前面提到的一些UI布局的绘制都是在主线程上进行的,又称UI线程,默认情况下,所有的操作都是在主线程上执行,这里如果我们系统通过ServiceAbility来完成后台运行任务,我们首先要初步了解一下asyncDispatch。

    (1)初识TaskDispatcher的异步派发任务asyncDispatch;

    那么TaskDispatcher又是什么呢?TaskDispatcher是一个任务分发器,它是Ability分发任务的基本接口,隐藏任务所在线程的实现细节。详细的介绍我们放到后面,先来了解异步派发任务asyncDispatch:派发任务,并立即返回,返回值是一个可用于取消任务的接口。

    Revocable revocable = globalTaskDispatcher.asyncDispatch(new Runnable() {

        @Override
                
            public void run() {
                        
                HiLog.info(label, "异步任务A执行");
                                
            }
                        
        });
    

    (2)创建Service Ability;

    通过工具栏File->New->Ability->Empty Service Ability来创建Service Ability,这样创建的好处是可以在config.json中自动完成Service Ability的配置。

    (3)启动Service Ability;

    这里还可以通过Intent的构造元素Parameters来传递参数,进行简单的数据传递。

    Intent intentService = new Intent();

    Operation operation = new Intent.OperationBuilder()

    .withDeviceId("")
        
    .withBundleName("com.codermrye.day10")
        
    .withAbilityName("com.codermrye.day10.ServiceAbility")
        
    .build();
    

    intentService.setOperation(operation);

    startAbility(intentService);

    (4)连接ServiceAbility

    如果Service需要与Page Ability或其他应用的Service Ability进行交互,则应创建用于连接的Connection。Service支持其他Ability通过connectAbility()方法与其进行连接。在使用connectAbility()处理回调时,需要传入目标Service的Intent与IAbilityConnection的实例。IAbilityConnection提供了两个方法供开发者实现:onAbilityConnectDone()用来处理连接的回调,onAbilityDisconnectDone()用来处理断开连接的回调。

    连接时步骤(1)(2)保持不变,connectAbility中传入intentService和connection。

    这里详细的创建IDL文件过程可参考《IDL接口使用规范》和《定义HarmonyOS IDL接口》。这个在后续的文章中分析讨论,目前官方的接口还无法成功回调onAbilityConnectDone()。

    Intent intentService = new Intent();

    ......

    intentService.setOperation(operation);

    // startAbility(intentService);

    // 连接Service

    connectAbility(intentService, connection);

    // 创建连接回调实例

    private IAbilityConnection connection = new IAbilityConnection() {

    // 连接到Service的回调
        
    @Override
        
    public void onAbilityConnectDone(ElementName elementName, IRemoteObject iRemoteObject, int resultCode) {
        
        // 在这里开发者可以拿到服务端传过来IRemoteObject对象,从中解析出服务端传过来的信息
                
    }
    
    // 断开与连接的回调
        
    @Override
        
    public void onAbilityDisconnectDone(ElementName elementName, int resultCode) {
        
    }
    

    };

    (5)最后附上其生命周期的说明。

    ServiceAbility生命周期

    本文由GZH程序员小小叶发布!

    相关文章

      网友评论

          本文标题:Day10 鸿蒙,Ability全家桶(二)如何后台运行任务

          本文链接:https://www.haomeiwen.com/subject/rndknktx.html