Service Ability 原创

CHXI29
发布于 2021-6-4 15:17
浏览
0收藏

官方文档链接 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");

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
标签
已于2021-6-7 15:57:12修改
收藏
回复
举报
回复
    相关推荐