自由流转--实例(二)

1、使用组件迁移数据

@Entry 
@Component
struct Index {
    private arr: number[] = [0,1,2,3,4,5,6,7,8,9,10]
    
    build() {
        Column() {
            // 部分组件支持分布式迁移
            List({space: 20}) {
                ForEach(this.arr, (item: number) => {
                    ...
                },(item: number) => (item.toString()))
            }
            // 给需要迁移的组件配置restoreId,不同组件不同的值
            .restoreId(1)
        }
    }
}

2、页面栈迁移

onContinue(wantParam: Record<string, Object | undefined>): AbilityConstant.OnContinueResult {
    ...
    return AbilityConstant.OnContinueResult.AGREE  // 同意迁移
}

onCreate(want:Want, launchParam: AbilityConstant.LaunchParam): void {
    this.checkPermissions()
    if (launchParam.launchReason === AbilityConstant.LaunchParam.CONTINUATION) {
        this.context.restoreWindowStage(new LocalStorage));
    }
}

3、少量状态数据迁移

// 源端:实现源端回调
onContinue(wantParam: {[key:string]: any}) {
    let sessionId: string = AppStore.get('sessionId') as string;
    ...
    wantParam['sessionId'] = AppStore.get<string>('sessionId')
}

// 对端:恢复数据
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
    ...
    if (launchParam.launchReason === AbilityConstant.LaunchReason.CONTINUATION) {
        AppStorage.setOrCreate<string>('sessionId', want.parameters?.sessionId)
        this.context.restoreWindowStorage(new LocalStorage())
    }
}

4、内存数据迁移

        创建分布式数据对象        

private localObject: distributedDataObject.DataObject | undefined = undefined
...
onWindowStageCreate(windowStage: window.windowStage) {
    ...
    if(!this.localObject) {
        let mailInfo: MailInfo = new MailInfo(undefined,undefined,undefined,undefined)
        this.localObject = distributedDataObject.create(this.context, mailInfo)
    }
    ...
}

         向分布式数据对象写 

onContinue(wantParam: Record<string, Object | undefined>): AbilityConstant.OnContinueResult {
    try {
        let sessionId: string = AppStorage.get('sessionId') as string
        if (!sessionId) {
            sessionId = distributedDataObject.getSessionId()
            AppStorage.setOrCreate('sessionId',sessionId)
        }
        if (this.loacalObject) {
            this.localObject.setSessionId(sessionId)
            this.localObject['recipient'] = AppStorage.get('recipient')
            this.localObject['sender'] = AppStorage.get('sender')
            this.localObject['subject'] = AppStorage.get('subject')
            this.localObject['emailContent'] = AppStorage.get('emailContent')
            this.localObject.save(wantParam.targetDevice as string)
            wantParam.siatributedSessionId = sessionId
        }
    }
}

        从分布式数据对象读 

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    if (launchParam.launchReason === AbilityConstant.LaunchReason.CONTINUATION) {
        if (!this.loacalObject) {
            let mailInfo: MailInfo = new MailInfo(undefined,undefined,undefined,undefined)
            this.localObject = distributedDataObject.create(this.context, mailInfo)
            this.localObject.on('change', this.changeCall)
        }
        if (sessionId && this.localObject) {
            this.localObject.setSessionId(sessionId)
            AppStorage.setOnCreat('recipient',this.localObject['recipient'])
            AppStorage.setOnCreat('sender',this.localObject['sender'])
            AppStorage.setOnCreat('subject',this.localObject['subject'])
            AppStorage.setOnCreate('emailContent',this.localObject['emailContent'])
        }
        this.context.restoreWindowStage(new LocalStorage())
    }
}

5、使用分布式文件传输数据

@Entry
@Component
struct MailHomePage {

  aboutToAppear() {
    if ((this.isContinuation === CommonConstants.CAN_CONTINUATION) && (this.appendix.length >= 1)) {
      this.readFile();
    }
  }

  build() {
    // ...
  }

  /**
   * Reading file from distributed file systems.
   */
  readFile(): void {
    this.appendix.forEach((item: AppendixBean) => {
      let filePath: string = this.distributedPath + item.fileName;
      let savePath: string = getContext().filesDir + '/' + item.fileName;
      try {
        while (fileIo.accessSync(filePath)) {
          let saveFile = fileIo.openSync(savePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
          let file = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE);
          let buf: ArrayBuffer = new ArrayBuffer(CommonConstants.FILE_BUFFER_SIZE);
          let readSize = 0;
          let readLen = fileIo.readSync(file.fd, buf, { offset: readSize });
          while (readLen > 0) {
            readSize += readLen;
            fileIo.writeSync(saveFile.fd, buf);
            readLen = fileIo.readSync(file.fd, buf, { offset: readSize });
          }
          fileIo.closeSync(file);
          fileIo.closeSync(saveFile);
        }
      } catch (error) {
        let err: BusinessError = error as BusinessError;
        Logger.error(`DocumentViewPicker failed with err: ${JSON.stringify(err)}`);
      }
    });
  }

  /**
   * Add appendix from file manager.
   *
   * @param fileType
   */
  documentSelect(fileType: number): void {
    try {
      let DocumentSelectOptions = new picker.DocumentSelectOptions();
      let documentPicker = new picker.DocumentViewPicker();
      documentPicker.select(DocumentSelectOptions).then((DocumentSelectResult: Array<string>) => {
        for (let documentSelectResultElement of DocumentSelectResult) {
          let buf = new ArrayBuffer(CommonConstants.FILE_BUFFER_SIZE);
          let readSize = 0;
          let file = fileIo.openSync(documentSelectResultElement, fileIo.OpenMode.READ_ONLY);
          let readLen = fileIo.readSync(file.fd, buf, { offset: readSize });
          // File name is not supported chinese name.
          let fileName = file.name;
          if (!fileName.endsWith(imageIndex[fileType].fileType) ||
          new RegExp("\[\\u4E00-\\u9FA5]|[\\uFE30-\\uFFA0]", "gi").test(fileName)) {
            promptAction.showToast({
              message: $r('app.string.alert_message_chinese')
            })
            return;
          }
          let destination = fileIo.openSync(getContext()
            .filesDir + '/' + fileName, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
          let destinationDistribute = fileIo.openSync(getContext()
            .distributedFilesDir + '/' + fileName, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
          while (readLen > 0) {
            readSize += readLen;
            fileIo.writeSync(destination.fd, buf);
            fileIo.writeSync(destinationDistribute.fd, buf);
            console.info(destinationDistribute.path);
            readLen = fileIo.readSync(file.fd, buf, { offset: readSize });
          }
          fileIo.closeSync(file);
          fileIo.closeSync(destination);
          fileIo.closeSync(destinationDistribute);
          this.appendix.push({ iconIndex: fileType, fileName: fileName });
        }
        Logger.info(`DocumentViewPicker.select successfully, DocumentSelectResult uri: ${JSON.stringify(DocumentSelectResult)}`);
      }).catch((err: BusinessError) => {
        Logger.error(`DocumentViewPicker.select failed with err: ${JSON.stringify(err)}`);
      });
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      Logger.error(`DocumentViewPicker failed with err: ${JSON.stringify(err)}`);
    }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值