技能管理

技能管理服务提供 API 处理 技能 相关的操作, 包括控制技能状态、监听技能状态变化以及分发技能指令。作为技能管理服务访问代理的 SkillManager对象,提供了技能管理服务的主要 API,可通过 RobotContext 对象获取到。

SkillManager skillManager = robotContext.getSystemService(SkillManager.SERVICE);

控制技能状态

Cruzr 系统中多数情况下技能状态是通过系统决策管理的,对于开发者需要主动控制技能状态的情况,技能管理也提供了接口处理。

暂停技能

promise /* [1] */ = skillManager.pauseSkill("com.xxx.pkg", "music" /* [2] */)
                .done(new DoneCallback<Void>() {
                    @Override
                    public void onDone(Void aVoid) {
                        // 调用成功会执行到这里
                    }
                })
                .fail(new FailCallback<SkillOperationException>() {
                    @Override
                    public void onFail(SkillOperationException e) {
                        // 调用失败会执行到这里
                    }
                });

[1] 返回暂停技能结果的异步对象,具体用法参考 Promise

[2] 暂停技能需要技能所在的 packagename 以及 技能名称

停止技能

promise = skillManager.stopSkill("com.xxx.pkg", "music");

停止技能的操作与暂停技能类似, 这里不在具体展开说明了。

监听技能状态变化

当技能状态变化后, Cruzr 系统会发出事件通知,技能管理提供了接口可以监听系统内技能的状态变化。

skillManager.registerSkillLifecycleCallbacks(new SkillLifecycleCallbacks() {
    @Override
    public void onSkillStarted(SkillInfo skillInfo /* [1] */ ) {
        // 技能启动会通知此处
    }

    @Override
    public void onSkillPaused(SkillInfo skillInfo,
                              SkillPauseCause skillPauseCause /* [2] */) {
        // 技能暂停会通知此处
    }

    @Override
    public void onSkillStopped(SkillInfo skillInfo,
                               SkillStopCause skillStopCause /* [3] */) {
        // 技能停止会通知此处
    }
});

[1] SkillInfo 包含了技能详细信息,其参数如下:

属性 getter 说明
SkillInfo.name 技能名称,参考 配置技能
SkillInfo.className 技能名称 Java 类名
SkillInfo.packageName 技能所在进程包名
SkillInfo.isSystemPackage 技能所在进程是否为系统进程
SkillInfo.directiveList 技能指令列表,详情参考 配置指令

[2] SkillPauseCause 技能暂停的原因,详情参考 技能状态

[3] SkillStopCause 技能停止的原因,详情参考 技能状态

进程间分发技指令

Cruzr 开发者经常会给其他进程技能发送指令, 技能管理专门提供接口分发进程间指令, 进程内指令分发请参考 上下文

    JSONObject jsonObject = new JSONObject();
    jsonObject.put("test", "test");

    Music music = new Music("xxx/xxx.pm3", "singer");

    Directive directive /* [1] */ = Directive.Builder 
        .fromAction(Directive.SOURCE_INTER_PROCESS, "music/play") /* [2] */
        .setSourceExtra(JsonObjectString.from(jsonObject))  /* [3] */
        .setParam(music, ContentTypes.PARCELABLE)  /* [4] */
        .build();

    skillManager.dispatchDirective(directive)
        .done(new DoneCallback<Void>() {
            @Override
            public void onDone(Void aVoid) {
            // 分发成功执行到此处
            }
        })
        .fail(new FailCallback<DispatchException>() {
            @Override
            public void onFail(DispatchException e) {
            // 分发失败执行到此处
            }
        });

[1] Directive 使用发送指令的指令对象, 详情参考 指令对象

[2] 指定指令来源是进程间发送指令, 指令 action 是 "music/play"

[3] 指令来源携带的带自定义信息

[4]指令附带参数, 指定类型为 ContentTypes.PARCELABLE, 此处 music 必须是 parcelable 类型, 其他类型参考 序列化类型

[5] 暂停技能需要技能所在的 packagename 以及 技能名称