0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HarmonyOS實(shí)戰(zhàn)案例:【分布式賬本】

jf_46214456 ? 來(lái)源:jf_46214456 ? 作者:jf_46214456 ? 2024-04-12 16:40 ? 次閱讀

簡(jiǎn)介

Demo基于Open Harmony系統(tǒng)使用ETS語(yǔ)言進(jìn)行編寫,本Demo主要通過(guò)設(shè)備認(rèn)證、分布式拉起、分布式數(shù)據(jù)管理等功能來(lái)實(shí)現(xiàn)。

應(yīng)用效果

  1. 設(shè)備認(rèn)證,獲取同一個(gè)局域網(wǎng)內(nèi)的設(shè)備ID,并拉起應(yīng)用

laqi

  1. 添加數(shù)據(jù)并在另一臺(tái)設(shè)備顯示該數(shù)據(jù)

accountbook

開(kāi)發(fā)步驟

開(kāi)發(fā)文檔:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]【復(fù)制地址前往】

1.新建Openharmony ETS工程

搜狗高速瀏覽器截圖20240326151344.png

更多鴻蒙開(kāi)發(fā)知識(shí)文檔+mau123789是v直接領(lǐng) 。在DevEco Studio中點(diǎn)擊File -> New Project ->[Standard]Empty Ability->Next,Language 選擇ETS語(yǔ)言,最后點(diǎn)擊Finish即創(chuàng)建成功。

new

2.界面代碼編寫

1) 首頁(yè)界面

index

build() {
    Flex({ direction: FlexDirection.Column}) {
      //發(fā)現(xiàn)設(shè)備
      Button('發(fā)現(xiàn)設(shè)備', { type: ButtonType.Normal, stateEffect: true })
        .borderRadius(8)
        .backgroundColor(0x317aff).width(90)
        .onClick(() = >{
          this.fun()
        })
      //設(shè)備認(rèn)證
      Button('authDevice', { type: ButtonType.Normal, stateEffect: true })
        .borderRadius(8)
        .backgroundColor(0x317aff).width(90)
        .onClick(() = >{
          this.authDevice()
        })

    // 拉起應(yīng)用
      Button('拉起應(yīng)用', { type: ButtonType.Normal, stateEffect: true })
        .borderRadius(8)
        .backgroundColor(0x317aff).width(90)
        .onClick(() = >{
                    this.startAb()
        })

      Stack({
        alignContent:Alignment.TopEnd
      }){
        Text('家庭賬本')
          .fontSize(20)
          .fontWeight(FontWeight.Bold)
          .width('100%')
          .margin({left:12})
           .onClick(() = >{
             //          routePage()
             this.fun()
           })
        Image("/picture/add.png")
          .width(40)
          .height(40)
          .align(Alignment.Start)
          .margin({
            right:12
          }).onClick(() = >{
          routePage()
        })

      }
      .width(350)
      .height(60)
      .margin({
        top:10,
        bottom:10
      })
      Flex({
        direction: FlexDirection.Column, alignItems:ItemAlign.Start,
      }){

        Text("2022年12月")
          .fontSize(20)
          .fontColor(Color.White)

        Text("結(jié)余")
          .fontSize(20)
          .fontColor(Color.White)
          .margin({
            top:30
          }).align(Alignment.Start)

        Text("總支出0|總收入0")
          .fontSize(16)
          .fontColor(Color.White)
          .margin({
            top:10
          }).align(Alignment.Start)
      }
      .backgroundColor("#665A5A")
      .height(230)
      .layoutWeight(1)
      .padding(10)
      .onClick(() = >{
        routePage()
      })

      Tabs() {
        TabContent() {
          ProjectList()
        }
        .tabBar("項(xiàng)目")

        TabContent() {
          Statistics()
        }
        .tabBar("統(tǒng)計(jì)")
      }
    }
    .width('100%')
    .height('100%')
    .padding({
      left:12,right:12
    })

  }

底部TabContent 項(xiàng)目模塊

@Component
struct ProjectList {
  remoteDataManager = new RemoteDataManager()
  @State ProjectData: Array< any > = []
  TestData:any[] =  []
  TestKvData: Array< any > = []
  kvManager = null
  kvStore = null
  STORE_ID = 'store_accountbook'
  aboutToAppear(){
    try {
      const config = {
        userInfo: {
          userId: '0',
          userType: 0
        },
        bundleName: 'com.example.accountbookets'
      }
      factory.createKVManager(config).then((manager) = > {
        this.kvManager = manager
        let options =
          {
            createIfMissing: true,
            encrypt: false,
            backup: false,
            autoSync: true,
            kvStoreType: 1,
            securityLevel: 3
          }
        this.kvManager.getKVStore(this.STORE_ID, options).then((store) = > {
          this.kvStore = store
          this.kvStore.get("key2").then((data) = > {
            this.ProjectData = JSON.parse(data)
          })

        }).catch((err) = > {
        })

      }).catch((err) = > {
      })
    } catch (e) {
    }
  }

  @Builder ProjectItem(image, name, des,time,money) {
    Flex({ direction: FlexDirection.Row,alignItems: ItemAlign.Center }){
      Image($r("app.media.icon1"))
        .width(30)
        .height(30)

      Column() {
        Text(name)
          .fontSize(16)
          .fontColor(Color.Black)
        Text('11:20')
          .fontSize(16)
          .fontColor(Color.Gray)
      }
      .alignItems(HorizontalAlign.Start)
      .margin({left:15})

      Text('HUAWEI')
        .fontSize(12)
        .fontColor(Color.Black)
        .margin({left:20})

      Text(des)
        .fontSize(14)
        .fontColor(Color.Gray)
        .margin({left:15})

      Column() {
        Text('-100')
          .fontSize(16)
          .fontColor(Color.Black)
        Text(time)
          .fontSize(16)
          .fontColor(Color.Gray)
      }
      .alignItems(HorizontalAlign.Start)
      .margin({left:20})
    }
    .width(400)
    .height(50)
    .margin({top:10})

  }

  build() {
    List() {
      ForEach(this.ProjectData, (item) = > {
        ListItem() {
          this.ProjectItem(item.image, item.name, item.des,item.time,item.money)
        }
        .onClick(() = > {
        })

      }, (item) = > JSON.stringify(item)) {

      }


    }
  }
}

底部TabContent 統(tǒng)計(jì)模塊

@Component
struct Statistics{
  build(){
    Flex({ direction: FlexDirection.Row}){

      Tabs() {
        TabContent() {
          PayList()
        }
        .tabBar("支出分類")

        TabContent() {

        }
        .tabBar("成員分類")
      }
    }
  }
}

統(tǒng)計(jì)模塊里面的TabContent

@Component
struct PayList {

  private PayData: PayBean[] = initializeOnStartup()
  @Builder PayItem(previewUrl, title, describe) {
    Flex({ direction: FlexDirection.Row,alignItems: ItemAlign.Center }){
      Image(previewUrl)
        .width(30)
        .height(30)


      Text(title)
        .fontSize(16)
        .fontColor(Color.Black)
        .margin({left:8})

      Text('100%')
        .fontSize(12)
        .fontColor(Color.Black)
        .margin({left:8})

      Progress({ value: 20, total: 150, style: ProgressStyle.Linear }).color(Color.Red).value(150).width(200)

      Text('-100')
        .fontSize(14)
        .fontColor(Color.Gray)
        .margin({left:8})
    }
    .width(400)
    .height(50)
    .margin({top:10})

  }

  build() {
    List() {
      ForEach(this.PayData, (item) = > {
        ListItem() {
          this.PayItem(item.image, item.name, item.des)
        }
        .onClick(() = > {
          console.info("點(diǎn)擊我")
          router.push({
            uri: "pages/VideoPlayer",

          })
        })
      }, (item) = > JSON.stringify(item)) {

      }
    }
  }
}
2) add.ets頁(yè)面

add

build() {
    Flex({ direction: FlexDirection.Column,alignItems: ItemAlign.Center}) {

      Flex({ direction: FlexDirection.Row,alignItems: ItemAlign.Center})
      {
        Image("/picture/icon_back.png")
          .width(35)
          .height(35)
         .onClick(() = >{
           router.push({
             uri: "pages/index",

           })
         })

        Text("加一筆")
          .fontSize(20)
          .fontWeight(FontWeight.Bold)
        .margin({left:20})
      }.margin({top:10})
      .padding({left:20})
      .height(100)
      .width(500)
      Stack({
        alignContent: Alignment.TopStart
      }){
        Tabs() {
          TabContent() {
            pay({payTime:$strTime,payRemark:$strRemark,payType:$strType})
          }
          .tabBar("支出")

          TabContent() {
            Income()
          }
          .tabBar("收入")
        }
        .height(450)
      }.width(500)
      .height(500)
      Flex({
        direction: FlexDirection.Row,alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center
      }){
        Text("輸入金額")
          .fontColor(Color.Black)
          .fontSize(20)
          .margin({
            right:15
          })
          .width(100)
        TextInput({ placeholder: '100', text:this.strMoney })
          .type(InputType.Normal)
          .placeholderColor(Color.Gray)
          .placeholderFont({ size: 20, weight: 2})
          .enterKeyType(EnterKeyType.Search)
          .caretColor(Color.Green)
          .width(250)
          .height(40)
          .borderRadius('20px')
      }
      .width(400)
      .height(50)

      Text('保存')
        .fontColor(Color.White)
        .fontSize(20)
        .margin({
          top:20
        })
        .textAlign(TextAlign.Center)
      .width(380)
        .height(80)
      .backgroundColor("#FE4F16")
        .onClick(() = >{

          TestData.push({image:"/picture/icon1.png",title:'canyin',des:'ceshi',time:'2021',money:'50'})
          if (AppStorage.Get("key1") == null) {
            AppStorage.SetAndLink("key1", TestData)
            this.remoteDataManager.dataChange("key2", JSON.stringify(TestData))
          }else{
            this.TestStorageData = AppStorage.Get("key1")
            //
//            this.TestStorageData.push({image:"/picture/icon1.png",title:'canyin',des:'beizhu',time:'2021',money:'50'})
            //具體代碼
            this.TestStorageData.push({image:"/picture/icon1.png",title:this.strType,des:this.strRemark,time:this.strTime,money:this.strMoney})
            AppStorage.SetAndLink("key1", this.TestStorageData)
            let str = JSON.stringify(this.TestStorageData)
            this.TestKvData = JSON.parse(str)
            this.remoteDataManager.dataChange("key2", JSON.stringify(this.TestKvData))
          }
          router.push({
            uri: "pages/index",

          })
        })

    }
    .width('100%')
    .height('100%')
  }

add頁(yè)面支出模塊

@Component
struct pay{
  @Link payTime:string
  @Link payRemark:string
  @Link payType:string
  @State private index:number = 0
  @State strType:string = "canyin"
  @State AccountData: Array< any > = [
    { previewUrl: "/picture/icon1.png", title: "canyin" ,number:0},
    { previewUrl: "/picture/icon2_2.png", title: "gouwu" ,number:1},
    { previewUrl: "/picture/icon3_3.png", title: "jiaotong" ,number:2},
    { previewUrl: "/picture/icon4_4.png", title: "fuwu" ,number:3},
    { previewUrl: "/picture/icon5_5.png", title: "jiaoyu" ,number:4},
    { previewUrl: "/picture/icon6_6.png", title: "yundong" ,number:5},
    { previewUrl: "/picture/icon7_7.png", title: "luxing" ,number:6},
    { previewUrl: "/picture/icon8_8.png", title: "yiliao" ,number:7},
//    { previewUrl: "/picture/icon9_9.png", title: "生活" ,number:9},
//    { previewUrl: "/picture/icon10_10.png", title: "寵物" ,number:10},
  ]

  @Builder ProItem(previewUrl, title,number) {
    Stack() {
      Flex({
        direction: FlexDirection.Column
      }) {
        if (this.index == number) {
          if (number == 0) {
            Image("/picture/icon1.png")
              .width(60)
              .height(60)
          }else if (number == 1) {
            Image("/picture/icon2.png")
              .width(60)
              .height(60)

          }else if (number == 2) {
            Image("/picture/icon3.png")
              .width(60)
              .height(60)

          }else if (number == 3) {
            Image("/picture/icon4.png")
              .width(60)
              .height(60)
          }else if (number == 4) {
            Image("/picture/icon5.png")
              .width(60)
              .height(60)

          }else if (number == 5) {
            Image("/picture/icon6.png")
              .width(60)
              .height(60)

          }else if (number == 6) {
            Image("/picture/icon7.png")
              .width(60)
              .height(60)
          }else if (number == 7) {
            Image("/picture/icon8.png")
              .width(60)
              .height(60)
          }else if (number == 8) {
            Image("/picture/icon9.png")
              .width(60)
              .height(60)
          }else if (number == 9) {
            Image("/picture/icon10.png")
              .width(60)
              .height(60)
          }
        }else{
          if (number == 0) {
            Image("/picture/icon1_1.png")
              .width(60)
              .height(60)
          }else{
            Image(previewUrl)
              .width(60)
              .height(60)
          }

        }
        Column() {
          Text(title)
            .fontSize(16)
            .fontColor(Color.Black)
        }
        .alignItems(HorizontalAlign.Center)
      }

    }
    .height(100)
    .width(100)
    .margin({
      bottom: 16
    })

  }
  build(){
    Flex({direction: FlexDirection.Column}){

      Grid(){
        ForEach(this.AccountData, (item) = > {
          GridItem() {
            this.ProItem(item.previewUrl, item.title,item.number)
          }
          .onClick(() = > {
            console.info("點(diǎn)擊我")
            this.index = item.number
            this.payType = this.AccountData[this.index].title
          })
        }, (item) = > JSON.stringify(item)) {

        }
      }
      .rowsTemplate('1fr 1fr')
      .columnsTemplate('1fr 1fr 1fr 1fr')
      .columnsGap(8)
      .rowsGap(8)
      .height(200)
//      Time()
//      Remark()
      // ******************時(shí)間**********************
      Flex({
        direction: FlexDirection.Row,alignItems: ItemAlign.Center
      }){
        Text("時(shí)間")
          .fontColor(Color.Black)
          .fontSize(20)
          .margin({
            right:15
          })
          .width(70)

        TextInput({ placeholder: '輸入收支時(shí)間', text: this.payTime })
          .type(InputType.Normal)
          .placeholderColor(Color.Gray)
          .placeholderFont({ size: 20, weight: 2})
          .enterKeyType(EnterKeyType.Search)
          .caretColor(Color.Green)
          .width(300)
          .height(40)
          .borderRadius('20px')
          .backgroundColor(Color.White)
          .onChange((value: string) = > {
            this.payTime = value
          })

      }
      .margin({
        top:20,left:15
      })
      .width(200)
      //*******************備注********************
      Flex({
        direction: FlexDirection.Row,alignItems: ItemAlign.Center
      }){
        Text("備注")
          .fontColor(Color.Black)
          .fontSize(20)
          .margin({
            right:15
          })
          .width(70)

        TextInput({ placeholder: '輸入說(shuō)明', text: this.payRemark })
          .type(InputType.Normal)
          .placeholderColor(Color.Gray)
          .placeholderFont({ size: 20, weight: 2})
          .enterKeyType(EnterKeyType.Search)
          .caretColor(Color.Green)
        //        .layoutWeight(8)
          .height(40)
          .width(300)
          .borderRadius('20px')
          .backgroundColor(Color.White)
          .onChange((value: string) = > {
            this.payRemark = value
          })
      }
      .margin({
        top:20,left:15
      })
      .width(50)
      .height(50)
    }
    .height('100%')
    .layoutWeight(1)

  }
}

收入模塊代碼

@Component
struct Income{

  build(){
    Flex({direction: FlexDirection.Column}){
      Time()
      Remark()

    }
  }
}

時(shí)間模塊

@Component
struct Time{
  @State inputTime:string = ''
  build(){
    Flex({
      direction: FlexDirection.Row,alignItems: ItemAlign.Center
    }){
      Text("時(shí)間")
        .fontColor(Color.Black)
        .fontSize(20)
        .margin({
          right:15
        })
      .width(70)

      TextInput({ placeholder: '2021', text: this.inputTime })
        .type(InputType.Normal)
        .placeholderColor(Color.Gray)
        .placeholderFont({ size: 20, weight: 2})
        .enterKeyType(EnterKeyType.Search)
        .caretColor(Color.Green)
        .width(300)
        .height(40)
        .borderRadius('20px')
        .backgroundColor(Color.White)
    }
    .margin({
      top:20,left:15
    })
    .width(200)
  }
}

備注模塊

@Component
struct Remark{
  @State inputRemark:string = ''
  build(){
    Flex({
      direction: FlexDirection.Row,alignItems: ItemAlign.Center
    }){
      Text("備注")
        .fontColor(Color.Black)
        .fontSize(20)
        .margin({
          right:15
        })
      .width(70)

      TextInput({ placeholder: 'ceshe', text: this.inputRemark })
        .type(InputType.Normal)
        .placeholderColor(Color.Gray)
        .placeholderFont({ size: 20, weight: 2})
        .enterKeyType(EnterKeyType.Search)
        .caretColor(Color.Green)
//        .layoutWeight(8)
        .height(40)
        .width(300)
        .borderRadius('20px')
        .backgroundColor(Color.White)

    }
    .margin({
      top:20,left:15
    })
    .width(50)
    .height(50)

  }
}

3.設(shè)備認(rèn)證

設(shè)備認(rèn)證是依賴[DeviceManager]組件來(lái)實(shí)現(xiàn)的,詳細(xì)代碼參考源碼RemoteDeviceModel.ets

1.創(chuàng)建DeviceManager實(shí)例

registerDeviceListCallback(callback) {
    if (typeof (this.#deviceManager) === 'undefined') {
      deviceManager.createDeviceManager('com.example.tictactoegame', (error, value) = > {
        if (error) return
        this.#deviceManager = value;
        this.registerDeviceListCallback_(callback);
      });
    } else {
      this.registerDeviceListCallback_(callback);
    }
  }

2.查詢可信設(shè)備列表

var list = this.#deviceManager.getTrustedDeviceListSync();
    if (typeof (list) != 'undefined' && typeof (list.length) != 'undefined') {
      this.deviceList = list;
    }

3.注冊(cè)設(shè)備上下線監(jiān)聽(tīng)

this.#deviceManager.on('deviceStateChange', (data) = > {
      switch (data.action) {
        case 0:
          this.deviceList[this.deviceList.length] = data.device;
          this.callback();
          if (this.authCallback != null) {
            this.authCallback();
            this.authCallback = null;
          }
          break;
        case 2:
          if (this.deviceList.length > 0) {
            for (var i = 0; i < this.deviceList.length; i++) {
              if (this.deviceList[i].deviceId === data.device.deviceId) {
                this.deviceList[i] = data.device;
                break;
              }
            }
          }
          this.callback();
          break;
        case 1:
          if (this.deviceList.length > 0) {
            var list = [];
            for (var i = 0; i < this.deviceList.length; i++) {
              if (this.deviceList[i].deviceId != data.device.deviceId) {
                list[i] = data.device;
              }
            }
            this.deviceList = list;
          }
          this.callback();
          break;
        default:
          break;
      }
    });

4.設(shè)備發(fā)現(xiàn)

this.#deviceManager.on('deviceFound', (data) = > {
      for (let i = 0; i < this.discoverList.length; i++) {
        if (that.discoverList[i].deviceId === data.device.deviceId) {
          return;
        }
      }
      this.discoverList[this.discoverList.length] = data.device;
      this.callback();
    });

5.設(shè)備認(rèn)證

authDevice(deviceInfo, callback){
    let extraInfo = {
      "targetPkgName": 'com.example.tictactoegame',
      "appName": 'com.example.tictactoegame',
      "appDescription": 'com.example.tictactoegame',
      "business": '0'
    };
    let authParam = {
      "authType": 1,
      "appIcon": '',
      "appThumbnail": '',
      "extraInfo": extraInfo
    };
    this.#deviceManager.authenticateDevice(deviceInfo, authParam, (err, data) = > {
      if (err) {
        this.authCallback = null;
      } else {
        this.authCallback = callback;
      }
    });
  }

4.數(shù)據(jù)管理

[分布式數(shù)據(jù)管理]依賴@ohos.data.distributedData模塊實(shí)現(xiàn),詳細(xì)參考源碼RemoteDataManager.ets

1.導(dǎo)入該模塊

import factory from '@ohos.data.distributedData';

2.創(chuàng)建KVManager實(shí)例,用于管理數(shù)據(jù)庫(kù)對(duì)象

registerDataListCallback(callback) {
    let that = this
    if (this.kvManager == null) {
      try {
        const config = {
          userInfo: {
            userId: '0',
            userType: 0
          },
          bundleName: 'com.example.tictactoegame'
        }
        factory.createKVManager(config).then((manager) = > {
          that.kvManager = manager
          that.registerDataListCallback_(callback)
        }).catch((err) = > {
        })
      } catch (e) {
      }
    } else {
      this.registerDataListCallback_(callback)
    }
  }

3.創(chuàng)建并獲取KVStore數(shù)據(jù)庫(kù)

registerDataListCallback_(callback) {
    let that = this
    if (that.kvManager == null) {
      callback()
      return
    }
    if (that.kvStore == null) {
      try {
        let options =
          {
            createIfMissing: true,
            encrypt: false,
            backup: false,
            autoSync: true,
            kvStoreType: 1,
            securityLevel: 3
          }
        this.kvManager.getKVStore(this.STORE_ID, options).then((store) = > {
          that.kvStore = store
          that._registerDataListCallback_(callback)
        }).catch((err) = > {
        })
      } catch (e) {
      }
    } else {
      this._registerDataListCallback_(callback)
    }
  }

4.訂閱指定類型的數(shù)據(jù)變更通知

_registerDataListCallback_(callback) {
    let that = this
    if (that.kvManager == null) {
      callback()
      return
    }
    this.kvStore.on('dataChange', 1, function(data) {
      if (data) {
         that.arr = data.updateEntries
        callback()
      }
    })
  }

5.添加指定類型鍵值對(duì)到數(shù)據(jù)庫(kù)

dataChange(key, value) {
    let that = this
      try {
        that.kvStore.put(JSON.stringify(key), JSON.stringify(value)).then((data) = > {
        }).catch((err) = > {
          prompt.showToast({message:'put err:'+JSON.stringify(value)})
        })

      } catch (e) {
      }
  }

5.遠(yuǎn)程拉起設(shè)備app

使用[FeatureAbility]模塊的startAbility接口拉起遠(yuǎn)程設(shè)備app

startAbilityContinuation(deviceId) {
    let wantValue = {
      bundleName: 'com.example.tictactoegame',
      abilityName: 'com.example.tictactoegame.MainAbility',
      deviceId: deviceId,
      parameters: {
        uri: 'pages/Fight'
      }
    };
    featureAbility.startAbility({ want: wantValue }).then(() = > {
      router.replace({ uri: 'pages/Fight' })
    });
  }

6.添加數(shù)據(jù)

更多鴻蒙開(kāi)發(fā)應(yīng)用知識(shí)已更新[qr23.cn/AKFP8k]參考前往。

新建一個(gè)賬單數(shù)據(jù) 添加到分布式數(shù)據(jù)

this.remoteDataManager.dataChange("key2", JSON.stringify(this.TestKvData))

在另一臺(tái)設(shè)備監(jiān)聽(tīng)并獲取顯示該條數(shù)據(jù)

private onPageShow() {

    this.remoteDataManager.registerDataListCallback(() = > {
      let arr = this.remoteDataManager.arr[0]
      this.strTest = arr.value.value
      this.ProjectData = JSON.parse(this.strTest)
     
  }

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ets
    ets
    +關(guān)注

    關(guān)注

    0

    文章

    20

    瀏覽量

    1622
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2352

    瀏覽量

    42858
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1975

    瀏覽量

    30194
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    HarmonyOS應(yīng)用開(kāi)發(fā)-分布式任務(wù)調(diào)度

    1. 介紹本篇CodeLab將實(shí)現(xiàn)的內(nèi)容HarmonyOS是面向全場(chǎng)景多終端的分布式操作系統(tǒng),使得應(yīng)用程序的開(kāi)發(fā)打破了智能終端互通的性能和數(shù)據(jù)壁壘,業(yè)務(wù)邏輯原子化開(kāi)發(fā),適配多端。通過(guò)一個(gè)簡(jiǎn)單應(yīng)用開(kāi)發(fā)
    發(fā)表于 09-18 09:21

    HarmonyOS應(yīng)用開(kāi)發(fā)-分布式設(shè)計(jì)

    設(shè)計(jì)理念HarmonyOS 是面向未來(lái)全場(chǎng)景智慧生活方式的分布式操作系統(tǒng)。對(duì)消費(fèi)者而言,HarmonyOS 將生活場(chǎng)景中的各類終端進(jìn)行能力整合,形成“One Super Device”,以實(shí)現(xiàn)
    發(fā)表于 09-22 17:11

    HarmonyOS分布式——跨設(shè)備遷移

    HarmonyOS分布式——跨設(shè)備遷移
    發(fā)表于 06-26 14:34

    HarmonyOS分布式應(yīng)用框架深入解讀

    KB級(jí)到GB級(jí)設(shè)備)。針對(duì)上述挑戰(zhàn),HarmonyOS作為一款面向萬(wàn)物互聯(lián)時(shí)代的、全新的分布式操作系統(tǒng),將迎刃而解,這得益于HarmonyOS分布式應(yīng)用框架,這些多設(shè)備組成一個(gè)超級(jí)
    發(fā)表于 11-22 15:15

    HDC2021技術(shù)分論壇:如何高效完成HarmonyOS分布式應(yīng)用測(cè)試?

    作者:liuxun,HarmonyOS測(cè)試架構(gòu)師HarmonyOS是新一代的智能終端操作系統(tǒng),給開(kāi)發(fā)者提供了設(shè)備發(fā)現(xiàn)、設(shè)備連接、跨設(shè)備調(diào)用等豐富的分布式API。隨著越來(lái)越多的開(kāi)發(fā)者投入到
    發(fā)表于 12-13 14:55

    如何高效完成HarmonyOS分布式應(yīng)用測(cè)試?

    作者:liuxun,HarmonyOS測(cè)試架構(gòu)師HarmonyOS是新一代的智能終端操作系統(tǒng),給開(kāi)發(fā)者提供了設(shè)備發(fā)現(xiàn)、設(shè)備連接、跨設(shè)備調(diào)用等豐富的分布式API。隨著越來(lái)越多的開(kāi)發(fā)者投入到
    發(fā)表于 12-13 18:07

    Hello HarmonyOS學(xué)習(xí)筆記:分布式新聞客戶端實(shí)戰(zhàn)(JS、eTS)

    源代碼下載地址:Codelabs: 分享知識(shí)與見(jiàn)解,一起探索HarmonyOS的獨(dú)特魅力。 - Gitee.com代碼講解視頻:華為開(kāi)發(fā)者學(xué)堂-【Hello系列直播課】第5期:分布式新聞客戶端實(shí)戰(zhàn)
    發(fā)表于 06-23 20:08

    區(qū)塊鏈分布式賬本是什么東西

    分布式賬本是區(qū)塊鏈的四大核心技術(shù)之一,如果說(shuō)密碼學(xué)是區(qū)塊鏈的基石,那么分布式賬本就是區(qū)塊鏈的骨架。
    發(fā)表于 12-06 10:28 ?5524次閱讀

    HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-HarmonyOS分布式應(yīng)用特征與挑戰(zhàn)

     HDC 2021華為開(kāi)發(fā)者大會(huì)HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-HarmonyOS分布式應(yīng)用特征與挑戰(zhàn)
    的頭像 發(fā)表于 10-23 14:41 ?1687次閱讀
    <b class='flag-5'>HarmonyOS</b>測(cè)試技術(shù)與<b class='flag-5'>實(shí)戰(zhàn)</b>-<b class='flag-5'>HarmonyOS</b><b class='flag-5'>分布式</b>應(yīng)用特征與挑戰(zhàn)

    HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-分布式應(yīng)用測(cè)試解決方案

    HDC 2021華為開(kāi)發(fā)者大會(huì)HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-HarmonyOS分布式應(yīng)用測(cè)試解決方案
    的頭像 發(fā)表于 10-23 14:48 ?1592次閱讀
    <b class='flag-5'>HarmonyOS</b>測(cè)試技術(shù)與<b class='flag-5'>實(shí)戰(zhàn)</b>-<b class='flag-5'>分布式</b>應(yīng)用測(cè)試解決方案

    HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-分布式UI測(cè)試框架

    HDC 2021華為開(kāi)發(fā)者大會(huì) HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-分布式UI測(cè)試框架演示
    的頭像 發(fā)表于 10-23 14:49 ?1383次閱讀
    <b class='flag-5'>HarmonyOS</b>測(cè)試技術(shù)與<b class='flag-5'>實(shí)戰(zhàn)</b>-<b class='flag-5'>分布式</b>UI測(cè)試框架

    HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-分布式業(yè)務(wù)音視頻測(cè)試場(chǎng)景分類

     HDC 2021華為開(kāi)發(fā)者大會(huì) HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-分布式業(yè)務(wù)音視頻測(cè)試場(chǎng)景分類
    的頭像 發(fā)表于 10-23 15:54 ?1753次閱讀
    <b class='flag-5'>HarmonyOS</b>測(cè)試技術(shù)與<b class='flag-5'>實(shí)戰(zhàn)</b>-<b class='flag-5'>分布式</b>業(yè)務(wù)音視頻測(cè)試場(chǎng)景分類

    HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-分布式業(yè)務(wù)音頻體驗(yàn)關(guān)注點(diǎn)

    HDC 2021華為開(kāi)發(fā)者大會(huì) HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-分布式業(yè)務(wù)音頻體驗(yàn)關(guān)注點(diǎn)
    的頭像 發(fā)表于 10-23 15:59 ?1191次閱讀
    <b class='flag-5'>HarmonyOS</b>測(cè)試技術(shù)與<b class='flag-5'>實(shí)戰(zhàn)</b>-<b class='flag-5'>分布式</b>業(yè)務(wù)音頻體驗(yàn)關(guān)注點(diǎn)

    HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-分布式業(yè)務(wù)音視頻體驗(yàn)測(cè)試全景

    HDC 2021華為開(kāi)發(fā)者大會(huì) HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-分布式業(yè)務(wù)音視頻體驗(yàn)測(cè)試全景
    的頭像 發(fā)表于 10-23 16:03 ?1762次閱讀
    <b class='flag-5'>HarmonyOS</b>測(cè)試技術(shù)與<b class='flag-5'>實(shí)戰(zhàn)</b>-<b class='flag-5'>分布式</b>業(yè)務(wù)音視頻體驗(yàn)測(cè)試全景

    HarmonyOS分布式應(yīng)用上架問(wèn)題分析

    HarmonyOS是新一代的智能終端操作系統(tǒng),給開(kāi)發(fā)者提供了設(shè)備發(fā)現(xiàn)、設(shè)備連接、跨設(shè)備調(diào)用等豐富的分布式API。隨著越來(lái)越多的開(kāi)發(fā)者投入到HarmonyOS分布式應(yīng)用開(kāi)發(fā),
    的頭像 發(fā)表于 12-24 17:56 ?1912次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>分布式</b>應(yīng)用上架問(wèn)題分析