在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【開發者說】鴻蒙原生應用開發——分布式數據對象

HarmonyOS開發者 ? 來源:HarmonyOS開發者 ? 作者:HarmonyOS開發者 ? 2023-12-07 21:40 ? 次閱讀
# 開發者說 #

【開發者說】欄目是為HarmonyOS開發者提供的展示和分享平臺,在這里,大家可以發表自己的技術洞察和見解,也可以展示自己的開發心得和成果。

歡迎大家積極投稿,后臺回復【投稿】,即可獲得投稿渠道。期待你們的分享~

01

什么是分布式數據對象

可信組網環境下,多個相互組網認證的設備將各自創建的對象加入同一個sessionId,使得加入的多個數據對象之間可以同步數據,也就是說,當某一數據對象屬性發生變更時,其他數據對象會檢測到這一變更,同時將自身屬性更新。

此時,該sessionId下的所有數據對象屬性相同,這樣的數據對象稱之為分布式數據對象。此外,分布式數據對象可以被動退出sessionId,當分布式數據對象退出sessionId后,該對象將檢測不到其他對象的變更。

02

分布式數據對象能力

1、分布式數據對象創建2、分布式數據對象查詢3、分布式數據對象修改4、分布式數據對象刪除5、分布式數據對象保存6、分布式數據對象訂閱(數據變更,上下線)

7、分布式數據對象加入、退出分布式組網

03

前提準備

1、開發工具:DevEco Studio 3.1.0.501

2、API9

3、SDK版本3.2.12.504

創建一個新的項目

新建項目,選擇API9版本,stage模型。

wKgZomVys6-AG0_1AAEXQ0yjzBI034.png05

權限申請

1、使用到的權限
  • ohos.permission.DISTRIBUTED_DATASYNC
  • 允許不同設備間的數據交換
  • 權限級別:normal
  • 授權方式:user_grant
  • ACL使能:TRUE

2、配置文件申明

首先,在項目的模塊級目錄下找到并打開module.json5文件,如下圖:

wKgZomVys6-Ac2AbAANDz2HtWlk721.png

在module下的對象里添加如下申明:

wKgZomVys6-ADikuAAB7_cWlh4w151.png

此時,配置文件中的權限申明就完成了,但是,此時我們還不能獲得這些權限。由于ohos.permission.DISTRIBUTED_DATASYNC權限是ACL使能為TRUE的權限,需要在簽名工具文件中說明一下。

如何找到對應的簽名工具文件呢?我們在安裝DevEcoStudio的時候是下載好了OpenHarmony的SDK的,此時在OpenHarmony文件夾中,打開 “SdkOpenHarmony SDK版本 oolchainslib” 該路徑,此時在lib文件夾中,咱們可以找到兩個json文件,分別為UnsgnedDebugProfileTemplate.json和UnsgnedReleasedProfileTemplate.json,點擊并打開這兩個文件,添加如下權限:

wKgaomVys6-AEVe-AAB8i3XVu2I513.png

3、權限申請編碼

在申請ohos.permission.DISTRIBUTED_DATASYNC權限時,其文檔中將其標注為用戶手動授權的權限,此時需要我們動態申請權限,在項目中,我們新建一個ets文件,我這里取名為RequestPermission.ets。

首先,導入以下包:

import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
import bundleManager from '@ohos.bundle.bundleManager';
importcommonfrom'@ohos.app.ability.common';

(左右滑動查看更多)

獲取訪問控制模塊對象實例:

let atManager = abilityAccessCtrl.createAtManager();

(左右滑動查看更多

編寫如下方法(這里使用的是異步函數):

export async function checkAccessTokenID(permission: Array) {
  // 獲取應用程序的accessTokenID
  let tokenId: number;
  let grantStatus: Array = []
  try {
    let bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
    let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
    tokenId = appInfo.accessTokenId;
  } catch (err) {
    console.error(`getBundleInfoForSelf failed, code is ${err.code}, message is ${err.message}`);
  }
  // 校驗應用是否被授予權限,若申請多個權限,建議循環檢查多個權限
  for (let index = 0;index < permission.length; index++) {
    try {
      grantStatus.push(await atManager.checkAccessToken(tokenId, permission[index]))
    } catch (err) {
      console.error(`checkAccessToken failed, code is ${err.code}, message is ${err.message}`);
    }
  }
  return grantStatus;
}


export async function checkPermission(context: common.UIAbilityContext, permissions: Array) {
  let grantStatus: Array = await checkAccessTokenID(permissions)
  for (let i = 0; i < grantStatus.length; i++) {
    if (grantStatus[i] === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
      console.info(`${permissions[i].toString()} 已授權`)
    } else {
      //申請權限
      console.info('開始向用戶申請權限')
      requestPermissionFromUser(context, permissions)
    }
  }
}
export async function requestPermissionFromUser(context: common.UIAbilityContext, permissions: Array) {
  // requestPermissionsFromUser會判斷權限的授權狀態來決定是否喚起彈窗
  atManager.requestPermissionsFromUser(context, permissions).then((data) => {
    let grantStatus: Array<number> = data.authResults
    let length: number = grantStatus.length
    for (let i = 0;i < length; i++) {
      if (grantStatus[i] === 0) {
        // 用戶授權,可以繼續訪問目標操作
        console.info(`${permissions[i].toString()} 權限申請成功`)
      } else {
        // 用戶拒絕授權,提示用戶必須授權才能訪問當前頁面的功能,并引導用戶到系統設置中打開相應的權限
        console.info(`${permissions[i].toString()} 權限申請被用戶拒絕`)
      }
    }
    // 授權成功
  })
}

(左右滑動查看更多

此時,我們申請權限的方法就算編寫完成了,在應用入口,即EntryAbility.ts文件中的

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam)

方法中回調權限申請函數:

requestPermissionFromUser(this.context,PERMISSIONS)

其中,PERMISSIONS定義如下:

const

PERMISSIONS:Array=['ohos.permission.DISTRIBUTED_DATASYNC']

到此,我們的權限申請就算完完全全完成啦,當用戶第一次安裝并打開應用的時候,應用會向用戶通過彈窗形式申請權限,用戶點擊授權即可賦予應用相應的權限啦~06

上手分布式數據對象代碼開發

登錄了同一華為帳號的HarmonyOS設備已經默認了進行了組網認證,所以在進行分布式數據對象開發之前無需再進行多設備組網認證這一階段的開發,開發變得相對簡單了起來。

首先,咱們制作一個簡易UI界面(UI界面僅供參考),如下圖所示:

wKgZomVys6-ADbPyAACVnGtFZXo950.png

相信對于有HarmonyOS開發經驗的小伙伴們來說這樣的UI界面制作并不困難,其中紅色圓點、綠色圓點為設備狀態,當設備狀態發生改變如下線時,顏色變為紅色,UI界面代碼如下:

import router from '@ohos.router'
import { DistributedDeviceManageFunc } from '../modules/DistributedDeviceManager/DistributedDeviceManagerFunctions'
import DistributedObjectFunc from '../modules/DistributedObject/DistributedObjectFunctions'
import { ContinuationDeviceManagerDialog } from '../view/ContinuationDeviceManagerDialog'
import { DistributedDeviceManagerDialog } from '../view/DistributedDeviceManagerDialog'


AppStorage.SetOrCreate('distributedDeviceList', [])
AppStorage.SetOrCreate('message', '分布式數據對象Demo測試')
AppStorage.SetOrCreate('statusColor', '#ff4fc100')
AppStorage.SetOrCreate('distributedColor', '#ffff0000')


@Entry
@Component
struct DistributedObjectDemo {
  @StorageLink('message') message: string = ''
  @StorageLink('statusColor') statusColor: string = ''
  @StorageLink('distributedColor') distributedColor: string = ''
  @StorageLink('distributedObj') distributedObj: DistributedObjectFunc = new DistributedObjectFunc()


  @Builder
  navigationTitle() {
    Row({ space: '10vp' }) {
      Button({ type: ButtonType.Normal }) {
        Image($rawfile('ic_public_back.svg'))
          .size({
            width: '24vp',
            height: '24vp'
          })
      }
      .width('36vp')
      .height('36vp')
      .backgroundColor(Color.White)
      .borderRadius('10vp')
      .onClick(() => {
        DistributedDeviceManageFunc.release()
        router.back()
      })


      Text('分布式數據對象測試')
        .fontWeight(FontWeight.Bold)
        .fontSize('20vp')
      Blank()
      Button({ type: ButtonType.Normal }) {
        Image($rawfile('ic_public_connection_filled.svg'))
          .size({
            width: '24vp',
            height: '24vp'
          })
      }
      .width('36vp')
      .height('36vp')
      .backgroundColor(Color.White)
      .borderRadius('10vp')
      .onClick(() => {
        this.distributedDeviceManagerDialogController.open()
      })
    }
    .padding('5vp')
    .width('90%')
  }


  build() {
    Navigation() {
      Column({ space: '20vp' }) {
        Row({ space: '20vp' }) {
          Text(`設備狀態`)
            .fontSize('20vp')
            .fontWeight(FontWeight.Bold)
          Circle()
            .width('25vp')
            .height('25vp')
            .fill(this.statusColor)
        }


        Row({ space: '20vp' }) {
          Text(`對端設備狀態`)
            .fontSize('20vp')
            .fontWeight(FontWeight.Bold)
          Circle()
            .width('25vp')
            .height('25vp')
            .fill(this.distributedColor)
        }


        Text(`SessionID:${this.distributedObj.getSessionId()}`)
          .fontSize('20vp')
          .fontWeight(FontWeight.Bold)
        Text(this.message)
          .fontSize('20vp')
          .fontWeight(FontWeight.Bold)
          .maxLines(2)
        Button('保存分布式數據對象')
          .buttonStyles()
          .onClick(() => {
            this.distributedObj.saveDistributedObject()
          })
        Button('修改分布式數據對象')
          .buttonStyles()
          .onClick(() => {
            this.distributedObj.updateDistributedObject()
          })
        Button('退出組網')
          .buttonStyles()
          .onClick(() => {
            this.distributedObj.exit()
            router.back()
          })
      }
      .width('100%')
    }
    .width('100%')
    .height('100%')
    .mode(NavigationMode.Auto)
    .titleMode(NavigationTitleMode.Mini)
    .hideBackButton(true)
    .title(this.navigationTitle())
  }
}


@Extend(Button) function buttonStyles() {
  .fontSize('20vp')
  .width('60%')
  .height('50vp')
}

(左右滑動查看更多

現在,我們的頁面制作就完成啦,下面開始重頭戲——分布式數據對象開發流程

1、導入模塊


	
import distributedObject from '@ohos.data.distributedDataObject'

(左右滑動查看更多

2、初始化distributedObject. DataObject對象

定義一個distributedObject. DataObject類型的變量。


	
mDistributedObject: distributedObject.DataObject

(左右滑動查看更多

調用distributedObject. Create()函數創建一個distributedObject. DataObject對象,并將其返回給定義的變量mDistributedObject。


	
this.mDistributedObject = distributedObject.create(globalThis.context, {
  name: 'jack',
  age: 18,
  isVis: false
})

(左右滑動查看更多

在create()方法中存在兩個參數,context和resource,context的類型為Context,resource類型為object,在這里我是在entryAbility.ts文件下的onWindowStageCreate()方法里面定義了一個全局變量globalThis.context。


	
globalThis.context = this.context

(左右滑動查看更多

3、設置組網sessionId


	
this.mDistributedObject.setSessionId(this.mSessionId)

(左右滑動查看更多

在setSessionId()函數中,參數sessionId為string類型,表示分布式對象組網唯一標識符,設置同步的sessionId,當可信組網中有多個設備時,多個設備間的對象如果設置為同一個sessionId,就能自動同步。

4、開啟設備狀態監聽

globalThis.statusCallback = (sessionId: string, networkId: string, status: string) => {
  AppStorage.Set('message', `組網設備狀況變更,id:${sessionId} status:${status} networkId:${networkId}`)
  if (status == 'online') {
    AppStorage.Set('distributedColor', '#ff4fc100')
  } else if (status == 'offline') {
    AppStorage.Set('distributedColor', '#ffff0000')
  }
}
this.mDistributedObject.on("status",globalThis.statusCallback)

(左右滑動查看更多

(sessionId: string,networkId: string, status: string)為callback回調函數返回的值,我們可以使用這些返回值判斷設備上下線狀態,其中status參數返回值為online或者offline,表示設備對端設備上下線。

5、開啟分布式數據對象同步監聽

globalThis.changeCallback = (sessionId: string, fields: Array<string>) => {
  console.info('分布式數據對象發生變化')
  if (fields != null && fields != undefined) {
    AppStorage.Set('message', `data change:${fields} sessionId:${sessionId}`)
  }
}
this.mDistributedObject.on("change",globalThis.changeCallback)

(左右滑動查看更多

當同一組網內分布式數據對象發生改變時,同一組網中的所有分布式數據對象同步發生變化,變化后的值為某一分布式數據對象改變后的值(sessionId: string, fields: Array)為callback回調函數返回值,其中,sessionId為組網唯一標識符,field為分布式數據對象的數據變更列表。

此時此刻,分布式數據對象就基本上開發完成啦。

如果有小伙伴想要修改分布式數據對象的屬性,可以直接修改


	
// @ts-ignore
this.mDistributedObject.name = 'lucy'
// @ts-ignore
this.mDistributedObject.age=25

(左右滑動查看更多

注意:根據當前版本IDE的編碼插件情況,不能直接寫this.mDistributedObject.age = 25,此時咱們需要加上//@ts-ignore就可以啦。

最后,使用完分布式數據對象后大家要記得釋放資源哦(注銷所有監聽,退出組網sessionId,將分布式數據對象設置為空值)


	
this.mDistributedObject.off("change")
this.mDistributedObject.off("status")
this.mDistributedObject.setSessionId()
this.mDistributedObject = null
this.mSessionId=null

(左右滑動查看更多

如果有小伙伴有兩部或兩部以上的華為設備,可以將程序燒錄到設備中,體驗一下分布式數據對象能力的快樂~


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 應用開發
    +關注

    關注

    0

    文章

    59

    瀏覽量

    9438
  • HarmonyOS
    +關注

    關注

    79

    文章

    1982

    瀏覽量

    30584
收藏 人收藏

    評論

    相關推薦

    鴻蒙千帆起】《開心消消樂》完成鴻蒙原生應用開發,創新多端聯動用戶體驗

    更優質的用戶體驗,基于強大的 AI 能力還可以實現精準識別、精確投放,為伙伴提供新流量,并共享全場景服務分發,助力生態共贏。數據顯示,截至今年 8 月份,鴻蒙生態的設備數已超過 7 億,鴻蒙生態
    發表于 01-03 10:22

    HarmonyOS SDK,助力開發者打造煥然一新的鴻蒙原生應用

    六大領域的開發能力,為開發者帶來簡潔、高效的開發體驗,開發者只需通過 API 調用即可實現豐富的鴻蒙
    發表于 01-19 10:31

    鴻蒙開發者預覽版如何?

    原生智能、原生互聯,6大極致原生體驗。 我初步閱讀了鴻蒙的源碼后,基本上可以確定是全自研底座,已經看不到Android的身影了。作為開發者
    發表于 02-17 21:54

    HarmonyOS Next 應用元服務開發-分布式數據對象遷移數據權限與基礎數據

    設備文件訪問實現文件的遷移,難以獲取文件同步完成的時間。為了保證更高的成功率,文件的遷移不建議繼續通過該方式實現,推薦使用分布式數據對象攜帶資產的方式。開發者此前通過跨設備文件訪問實現
    發表于 12-24 09:40

    HarmonyOS Next 應用元服務開發-分布式數據對象遷移數據文件資產遷移

    設備文件訪問實現文件的遷移,難以獲取文件同步完成的時間。為了保證更高的成功率,文件的遷移不建議繼續通過該方式實現,推薦使用分布式數據對象攜帶資產的方式。開發者此前通過跨設備文件訪問實現
    發表于 12-24 10:11

    華為鴻蒙—時代的開啟

    總線技術”通過公共通信平臺,分布式數據管理,分布式能力調度和虛擬外設四大能力。將相應分布式應用的底層技術實現難度對應用開發者屏蔽,使
    發表于 09-03 11:19

    HarmonyOS應用開發-分布式設計

    不同終端設備之間的極速連接、硬件協同、資源共享,為用戶提供最佳的場景體驗。分布式設計指南可以幫助應用開發者了解如何充分發揮“One Super Device”的能力,提供獨特的跨設備交互體驗。說明:本設計指南后續舉例中將包括手機、智慧屏、手表等多種設備,其中手機均指 EM
    發表于 09-22 17:11

    HarmonyOS分布式數據庫,為啥這么牛?

    HarmonyOS 2.0 重要的三大核心技術底座之一:HarmonyOS 分布式數據管理平臺,也同步對開發者進行了細致的宣講,我作為開發者有幸參與聆聽了相關議題介紹。
    發表于 11-19 15:38

    絕對干貨!HarmonyOS開發者日資料全公開,鴻蒙開發者都在看

    應用開發模板,分布式調試調優,上架開發規范解讀等。6、HarmonyOS 分布式應用框架深入解讀:該主題深度解析HarmonyOS分布式應用
    發表于 08-04 14:36

    分布式數據對象:超級終端的"全局變量"

    設備訪問這些變量就能像操作本地變量一樣,數據就能夠自動高效、便捷地實現多端同步了。為此,本次 OpenHarmony v3.1 Release 版本新增了分布式數據對象特性。
    發表于 06-09 15:18

    開發者】XstoryMaker快速書寫劇本場景動畫

    。 我在開發XstoryMaker關于視覺小說的分布式流轉的時候根本沒有感受到這是兩臺設備在做數據傳輸的開發,兩個端的開發代碼只需要按照一個
    發表于 09-14 12:04

    鴻蒙原生應用/元服務開發-開發者如何進行真機測試

    前提條件:已經完成鴻蒙原生應用/元服務開發,已經能相對熟練使用DevEco Studio,開發者自己有鴻蒙4.0及以上的真機設備。 真機測試
    發表于 11-30 09:46

    鴻蒙原生應用開發——分布式數據對象

    01、什么是分布式數據對象 在可信組網環境下,多個相互組網認證的設備將各自創建的對象加入同一個 sessionId,使得加入的多個數據
    發表于 12-08 10:01

    華為開發者大會2022主題演講:分布式安全

    華為開發者大會2022主題演講:分布式安全:分布式(設備}安全、分布式(數據}安全、分布式{協同
    的頭像 發表于 11-04 15:20 ?956次閱讀
    華為<b class='flag-5'>開發者</b>大會2022主題演講:<b class='flag-5'>分布式</b>安全

    開發者的開源鴻蒙故事

    近日,在以“一切為了開發者”為主題的“2024開放原子開發者大會暨首屆開源技術學術大會”上,開源鴻蒙5.0 Release版本正式發布,備受各方關注。該版本在系統完備度、分布式創新、
    的頭像 發表于 01-06 10:28 ?179次閱讀
    主站蜘蛛池模板: 日本黄视频在线播放 | 好爽好深太大了再快一点 | 成人在线一区二区 | 视频在线h | 手机在线色| 五月天男人的天堂 | 久久成人综合 | 国产美女在线精品免费观看 | 欧美日韩国产在线一区 | 婷婷久久久五月综合色 | 久久久免费精品 | 亚洲a免费 | 国产在线五月综合婷婷 | 欧美色图在线观看 | 欧美成人免费全部观看天天性色 | 国产美女精品久久久久中文 | 欧美极品bbbbⅹxxxx | 久久性 | 天天狠天天插 | 深夜释放自己vlog糖心旧版本 | 天天摸夜夜摸爽爽狠狠婷婷97 | 午夜影剧 | 国产精品久久久亚洲 | 热99在线视频 | 色免费观看 | 久久久久88色偷偷免费 | 好骚综合在线 | 农村三级毛片 | 1024你懂的国产精品 | 日本写真高清视频免费网站网 | 天天干天天拍 | 午夜视频在线免费观看 | 天天添天天干 | 韩国三级理论在线看中文字幕 | 我不卡老子影院午夜伦我不卡四虎 | 国产成人三级经典中文 | 色五丁香| 欧美色婷婷 | 99草在线视频 | 色欲麻豆国产福利精品 | 性欧美丰满xxxx性久久久 |