Service Ability
头像 宋你一朵小红花 2021-06-07 10:01:00    发布
3723 浏览 14 点赞 17 收藏

官方文档链接 https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-service-concept-0000000000044457

基本概念

基于Service模板的Ability主要用于【后台运行任务】,【不提供】用户交互界面。Service是【单实例】的。在一个设备上,相同的Service只会存在一个实例。

回调方法



onStart()

该方法在【创建】Service【的时候】,用于Service的初始化。在Service的整个生命周期只会调用一次,调用时传入的Intent应为空。



onCommand()

在Service【创建完成之后】,该方法在客户端每次启动该Service时都会调用,用户可以在该方法中做一些调用统计、初始化类的操作。



onConnect​()

在【AbilityService 连接时调用】,该方法返回IRemoteObject对象,用户可以在该回调函数中生成对应Service的IPC通信通道,以便Ability与Service交互。Ability可以多次连接同一个Service,系统会缓存该Service的IPC通信对象,只有第一个客户端连接Service时,系统才会调用Service的onConnect方法来生成IRemoteObject对象,而后系统会将同一个RemoteObject对象传递至其他连接同一个Service的所有客户端,而无需再次调用onConnect方法。



onDisconnect​()

在Ability与绑定的Service断开连接时。



onStop()

在Service销毁时。Service应通过实现此方法来清理任何资源,如关闭线程、注册的侦听器等。

案例

在MainAbilitySlice的代码


public class MainAbilitySlice extends AbilitySlice {
    private static final HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, 0xFFFFF, "CHXI");
    @Override
    public void onStart(Intent intent) {

        Intent myIntent = new Intent();
        //设置操作
        Operation operation = new Intent.OperationBuilder()
                .withDeviceId("")
                //包名
                .withBundleName("com.chxi.servicestu")
                //全类名 或者 class文件
                .withAbilityName(ServiceAbility.class)
                .build();
        myIntent.setOperation(operation);
        //启动serviceAbility
        startAbility(myIntent);
       //1、创建连接Service回调实例

        IAbilityConnection connect = new IAbilityConnection() {
            @Override
            public void onAbilityConnectDone(ElementName elementName, IRemoteObject iRemoteObject, int i) {
                HiLog.info(label,"MyConnectAbilitySlice::ConnectDone");
                HiLog.info(label,""+i);

            }

            @Override
            public void onAbilityDisconnectDone(ElementName elementName, int i) {
                HiLog.info(label,"MyConnectAbilitySlice::DisconnectDone");
            }
        };
        //2、连接
       connectAbility(myIntent, connect);
       //3、断开连接
        disconnectAbility(connect);
        super.setUIContent(ResourceTable.Layout_ability_main);
    }

    @Override
    public void onActive() {
        super.onActive();
    }

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

ServiceAbility代码



public class ServiceAbility extends Ability {
    private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xFFFFF, "CHXI");
    // 创建自定义IRemoteObject实现类
     class MyRemoteObject extends LocalRemoteObject {
        private  int remoteNum =  0;
        MyRemoteObject(){
            remoteNum = 111;
            HiLog.info(LABEL_LOG, "ServiceAbility::MyRemoteObject");
        }

        public int getRemoteNum() {
            return remoteNum;
        }
    }

    // 把IRemoteObject返回给客户端
    @Override
    protected IRemoteObject onConnect(Intent intent) {
        HiLog.info(LABEL_LOG, "ServiceAbility::onConnect");
        return new MyRemoteObject();
    }

    @Override
    public void onStart(Intent intent) {
        HiLog.info(LABEL_LOG, "ServiceAbility::onStart");
        super.onStart(intent);
    }

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

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

    @Override
    public void onCommand(Intent intent, boolean restart, int startId) {
        HiLog.info(LABEL_LOG, "ServiceAbility::onCommand");
    }



    @Override
    public void onDisconnect(Intent intent) {
        HiLog.info(LABEL_LOG, "ServiceAbility::onDisconnect");
    }
}

Service Ability-鸿蒙开发者社区


1、初始化service 调用 onStart
2、初始化完成后 调用 onCommand
3、连接服务与断开连接服务 最后调用stop之前,推到后台调用onbackground。

前台Service 代码 在serviceAbility里面的onstart()里面调用


//创建通知请求 设置通知id为1005
        NotificationRequest request = new NotificationRequest(1005);
        //创建普通通知
        NotificationRequest.NotificationNormalContent content = new NotificationRequest.NotificationNormalContent();
        //设置通知的标题和内容
        content.setTitle("Title").setText("Text");
        //创建通知内容
        NotificationRequest.NotificationContent notificationContent = new NotificationRequest.NotificationContent(content);
        //设置通知
        request.setContent(notificationContent);

        keepBackgroundRunning(1005,request);
        HiLog.error(MyUtils.getLabel(), "ServiceAbility::startupForegroundService");


©本站发布的所有内容,包括但不限于文字、图片、音频、视频、图表、标志、标识、广告、商标、商号、域名、软件、程序等,除特别标明外,均来源于网络或用户投稿,版权归原作者或原出处所有。我们致力于保护原作者版权,若涉及版权问题,请及时联系我们进行处理。
分类
其它
头像

宋你一朵小红花

我还没有写个人简介......

881

帖子

0

提问

1679

粉丝

关注
热门推荐
地址:北京市朝阳区北三环东路三元桥曙光西里甲1号第三置业A座1508室 商务内容合作QQ:2291221 电话:13391790444或(010)62178877
版权所有:电脑商情信息服务集团 北京赢邦策略咨询有限责任公司
声明:本媒体部分图片、文章来源于网络,版权归原作者所有,我司致力于保护作者版权,如有侵权,请与我司联系删除
京ICP备:2022009079号-2
京公网安备:11010502051901号
ICP证:京B2-20230255