From d5e9acc522b8fe636ca099562a4dffda46d50402 Mon Sep 17 00:00:00 2001 From: wangdongdong Date: Wed, 23 Mar 2022 15:12:21 +0800 Subject: [PATCH] continuation develop guide Signed-off-by: wangdongdong Change-Id: I8427b1a3df5220d939e7d1ed73255e126ee0726c --- zh-cn/application-dev/ability/Readme-CN.md | 2 +- .../ability/figures/continuation-info.png | Bin 0 -> 13672 bytes .../ability/stage-ability-continuation.md | 248 +++++++++++------- 3 files changed, 152 insertions(+), 98 deletions(-) create mode 100755 zh-cn/application-dev/ability/figures/continuation-info.png mode change 100644 => 100755 zh-cn/application-dev/ability/stage-ability-continuation.md diff --git a/zh-cn/application-dev/ability/Readme-CN.md b/zh-cn/application-dev/ability/Readme-CN.md index f3b879e4b9..f230413e2d 100644 --- a/zh-cn/application-dev/ability/Readme-CN.md +++ b/zh-cn/application-dev/ability/Readme-CN.md @@ -11,7 +11,7 @@ - [Ability开发指导](stage-ability.md) - [ServiceExtensionAbility开发指导](stage-serviceextension.md) - [FormExtensionAbility开发指导](stage-formextension.md) - - [应用迁移开发指导](stage-ability-continuation.md) + - [跨端迁移开发指导](stage-ability-continuation.md) - [Call调用开发指导](stage-call.md) - 其他 - [WantAgent使用指导](wantagent.md) diff --git a/zh-cn/application-dev/ability/figures/continuation-info.png b/zh-cn/application-dev/ability/figures/continuation-info.png new file mode 100755 index 0000000000000000000000000000000000000000..69c38949921686520378a118df2e9f82912967a8 GIT binary patch literal 13672 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 { + let permissions: Array = [ + "ohos.permission.DISTRIBUTED_DATASYNC" + ]; + let needGrantPermission = false + let accessManger = accessControl.createAtManager() + Logger.info("app permission get bundle info") + let bundleInfo = await bundle.getApplicationInfo(BUNDLE_NAME, 0, 100) + Logger.info(`app permission query permission ${bundleInfo.accessTokenId.toString()}`) + for (const permission of permissions) { + Logger.info(`app permission query grant status ${permission}`) + try { + let grantStatus = await accessManger.verifyAccessToken(bundleInfo.accessTokenId, permission) + if (grantStatus === PERMISSION_REJECT) { + needGrantPermission = true + break; + } + } catch (err) { + Logger.error(`app permission query grant status error ${permission} ${JSON.stringify(err)}`) + needGrantPermission = true + break; + } + } + if (needGrantPermission) { + Logger.info("app permission needGrantPermission") + try { + await this.context.requestPermissionsFromUser(permissions) + } catch (err) { + Logger.error(`app permission ${JSON.stringify(err)}`) + } + } else { + Logger.info("app permission already granted") + } + } + ``` + -2. 实现onContinue接口 +2. 实现onContinue接口 - 导入模块 + onContinue接口在**发起端**被调用,主要用于在迁移发起时,通知开发者保存控件状态变量和内存中数据,准备迁移。当应用准备完成后,需要返回OnContinueResult.AGREE(0)表示同意迁移,否则返回相应的错误码拒绝迁移。如果不实现该接口,系统将默认为拒绝迁移。 - ``` + 导入模块 + + ```javascript import Ability from '@ohos.application.Ability'; + import AbilityConstant from '@ohos.application.AbilityConstant'; ``` - - - 要实现迁移,此接口必须实现并返回true,否则默认为拒绝迁移。 + + - 要实现迁移,此接口必须实现并返回AGREE,否则默认为拒绝迁移。 - 示例 ```javascript - onContinue(wantParams : {[key: string]: any}) { - console.log("MainAbility onContinue") - return true; - } + onContinue(wantParam : {[key: string]: any}) { + Logger.info("onContinue using distributedObject") + // set user input data into want params + wantParam["input"] = AppStorage.Get('ContinueInput'); + Logger.info(`onContinue input = ${wantParam["input"]}`); + return AbilityConstant.OnContinueResult.AGREE + } ``` 3. 在onCreate接口中实现迁移逻辑 - - 远端设备上,在onCreate中根据launchReason判断该次启动是否为迁移LaunchReason.CONTINUATION(3) + onCreate接口在迁移**目标端**被调用,在目标端ability被拉起时,通知开发者同步已保存的内存数据和控件状态,完成后触发页面的恢复。如果不实现该接口中迁移相关逻辑,ability将会作为普通的启动方式拉起,无法恢复页面。 + - 远端设备上,在onCreate中根据launchReason判断该次启动是否为迁移LaunchReason.CONTINUATION + - 完成数据恢复后,开发者需要调用**restoreWindowStage**来触发页面恢复。 - + * 示例 ```javascript - onCreate(want , launchParam) { - // Ability is creating, initialize resources for this ability - console.log("MainAbility onCreate", launchParam.launchReason); - if (launchParam.launchReason == LaunchReason.CONTINUATION) { - this.contentStorage = new ContenStorage(); + onCreate(want, launchParam) { + Logger.info(`MainAbility onCreate ${AbilityConstant.LaunchReason.CONTINUATION}`) + globalThis.abilityWant = want; + if (launchParam.launchReason == AbilityConstant.LaunchReason.CONTINUATION) { + let input = want.parameters.input // get user data from want params + AppStorage.SetOrCreate('ContinueInput', input) + Logger.info(`onCreate for continuation sessionId: ${this.sessionId}`) + + this.contentStorage = new ContentStorage(); this.context.restoreWindowStage(this.contentStorage); } } - ``` ### 迁移数据 -1. 使用自定义数据 +1. 使用分布式对象 - - wantParams中可以填写key-value形式自定义数据,key类型string,填充的数据将随want被传输到远端,用于携带一些简单、轻量的数据。 + 分布式数据对象提供了与本地变量类似的操作,实现两个设备的数据同步,当设备1的应用A的分布式数据对象增、删、改数据后,设备2的应用A也可以获取到对应的数据变化,同时还能监听数据变更以及对端数据对象的上下线。用法详见[分布式对象指导文档](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/database/database-distributedobject-guidelines.md)。 + 迁移场景中,分布式对象(distributedDataObject)主要用于将本机内存数据同步到目标设备。 - ```javascript - onContinue(wantParams : {[key: string]: any}) { - console.log("Continue My Data") - wantParams["myData"] = "my1234567"; - return true; - } - ``` - - - 同时在远端判断如果是迁移,可以从want.parameters中取出在发起端保存的自定义数据。 + - 发起端在onContinue中,将待迁移的数据存入分布式对象中,然后设置好session id,并通过wantParams将session id传到远端设备。 - ```javascript - onCreate(want , launchParam) { - if (launchParam.launchReason == LaunchReason.CONTINUATION) { - console.log("onCreate LaunchReason = CONTINUATION",want.parameters["myData"]); // my1234567 - ... - this.context.restoreWindowStage(this.contentStorage); - } + ```javascript + import Ability from '@ohos.application.Ability'; + import distributedObject from '@ohos.data.distributedDataObject'; + + var g_object = distributedObject.createDistributedObject({name:undefined}); + + export default class MainAbility extends Ability { + contentStorage : ContenStorage + sessionId : string; + + onContinue(wantParam : {[key: string]: any}) { + Logger.info("onContinue using distributedObject") + this.sessionId = distributedObject.genSessionId(); + //set distributed data object session id + g_object.setSessionId(this.sessionId); + g_object.name = "Amy"; + // set session id into want params + wantParam["session"] = this.sessionId; + return AbilityConstant.OnContinueResult.AGREE } - ``` + ``` + - 目标设备在onCreate中,取出发起端传过来的session id,建立分布式对象并关联该session id,这样就能实现分布式对象的同步。需要注意的是,在调用restoreWindowStage之前,迁移需要的分布式对象必须全部关联完,保证能够获取到正确的数据。 - -2. 使用分布式对象 - - 使用分布式对象可以传输更多的数据到远端设备,更多用法详见分布式对象接口文档。 - - - 发起端在onContinue中,将待迁移的数据存入分布式对象中,然后设置好session id,并通过wantParams将session id传到远端设备。 - - - - 远端设备在onCreate中,取出发起端传过来的session id,建立分布式对象并关联该session id,这样就能实现分布式对象的同步。需要注意的是,在调用restoreWindowStage之前,迁移需要的分布式对象必须全部关联完,保证能够获取到正确的数据。 - - - * 示例 - ```javascript - import Ability from '@ohos.application.Ability'; - import distributedObject from '@ohos.data.distributedDataObject'; - - var g_object = distributedObject.createDistributedObject({name:undefined}); - - export default class MainAbility extends Ability { - contentStorage : ContenStorage - sessionId : string; - onCreate(want , launchParam) { - if (launchParam.launchReason == 3) { - this.sessionId = want.parameters["session"] // 取出session id - - function statusCallback(sessionId, networkid, status) { - console.info("object status change sessionId: " + sessionId + " status: " + status + - "g_object.name: " + g_object.name); // 回调中可以取到同步过来的分布式对象内容 name = Amy - } - g_object.on("status", statusCallback); // 注册分布式对象同步结果的监听 - - g_object.setSessionId(this.sessionId); // 将本地分布式对象也关联发起端的session id - - this.contentStorage = new ContenStorage(); - this.context.restoreWindowStage(this.contentStorage); - } - } - - onContinue(wantParams : {[key: string]: any}) { - console.log("using distributedObject") - this.sessionId = "654321"; - g_object.setSessionId(this.sessionId); //1 设置分布式对象的session id - g_object.name = "Amy"; // 填入数据 - wantParams["session"] = this.sessionId; // 将session id 通过want传到远端 - return true; - } + import Ability from '@ohos.application.Ability'; + import distributedObject from '@ohos.data.distributedDataObject'; + + var g_object = distributedObject.createDistributedObject({name:undefined}); + + export default class MainAbility extends Ability { + contentStorage : ContentStorage + sessionId : string; + + statusCallback(sessionId, networkid, status) { + Logger.info(`continuation object status change, sessionId: ${sessionId}, status: ${status}, g_object.name: ${g_object.name}`) + } + + onCreate(want, launchParam) { + Logger.info(`MainAbility onCreate ${AbilityConstant.LaunchReason.CONTINUATION}`) + if (launchParam.launchReason == AbilityConstant.LaunchReason.CONTINUATION) { + // get distributed data object session id from want params + this.sessionId = want.parameters.session + Logger.info(`onCreate for continuation sessionId: ${this.sessionId}`) + + g_object.on("status", this.statusCallback); + // set session id, so it will sync data from remote device + g_object.setSessionId(this.sessionId); + + this.contentStorage = new ContentStorage(); + this.context.restoreWindowStage(this.contentStorage); + } + } + } ``` - + - +以上完整的示例见sample -- GitLab