技能管理
技能管理服务提供 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 以及 技能名称