鴻蒙Harmony開發初探

一、背景

9月25日華為秋季全場景新品發布會,余承東宣布鴻蒙HarmonyOS NEXT蓄勢待發,不再支持安卓應用。網易有道、同程旅行、美團、國航、阿里等公司先后宣布啟動鴻蒙原生應用開發工作。

二、鴻蒙Next介紹

HarmonyOS是一款面向萬物互聯,全新的分布式操作系統。

1、鴻蒙Next(5.0)系統底座全棧自研,去掉了傳統的AOSP代碼。

2、僅支持鴻蒙內核和鴻蒙系統的應用。

3、業內人士向證券時報公司記者表示:“華為內部確實有這計劃,就是明年Q1推出不兼容安卓的鴻蒙版本,但目前內部還沒有下發相關通知,所以具體何時推出暫不明確

三、鴻蒙系統開發

鴻蒙系統架構

3.1 IDE

HUAWEI DevEco Studio 基于IntelliJ IDEA Community開源版本定制開發,支持HarmonyOS和OpenHarmony應用及服務開發。

下載地址:developer.harmonyos.com/cn/develop/…

3.2 示例講解

github地址: github.com/guofeng007/…

界面效果:

全局配置

{"app": {// 最重要的是包名,版本號,圖片和app名稱"bundleName": "com.example.myapplication", "vendor": "example","versionCode": 1000000,"versionName": "1.0.0","icon": "$media:app_icon","label": "$string:app_name"}
}
模塊配置
{"module": {"name": "entry","type": "entry",// 模塊生命周期入口 "srcEntry": "./ets/MyAbilityStage.ts", "description": "$string:module_desc",// 應用入口"mainElement": "EntryAbility","deviceTypes": ["phone"],"deliveryWithInstall": true,"installationFree": false,"pages": "$profile:main_pages","abilities": [{// 入口具體聲明配置,參考android"name": "EntryAbility","srcEntry": "./ets/entryability/EntryAbility.ts","description": "$string:EntryAbility_desc","icon": "$media:icon","label": "$string:EntryAbility_label","startWindowIcon": "$media:icon","startWindowBackground": "$color:start_window_background","exported": true,"skills": [{"entities": ["entity.system.home"],"actions": ["action.system.home"]}]}]}
}
APP模塊全局聲明周期
import AbilityStage from '@ohos.app.ability.AbilityStage';export default class MyAbilityStage extends AbilityStage {onCreate() {// 應用的HAP在首次加載的時,為該Module初始化操作}onAcceptWant(want) {// 僅specified模式下觸發return "MyAbilityStage";}
}
入口任務棧

這個比較重要,對從安卓轉過來的同學來說,可以理解為一個TaskStack,在手機的多任務欄,顯示為一個任務,是一個任務容器。

EntryAbility 繼承自 UIAbility 并實現了其中的 onCreate 、onDestroy 、 onWindowStageCreate 、 onWindowStageDestroy 、 onForeground 、 onBackground 等方法,顯然,這些方法就是這個 ability 的生命周期。 然后在 onWindowStageCreate 生命周期中通過 windowStage.loadContent 加載了 pages/Index 的內容,pages/Index就相當于我們的入口UI頁面。

UIAbility介紹: UIAbility是一種包含用戶界面的應用組件,主要用于和用戶進行交互。UIAbility也是系統調度的單元,為應用提供窗口在其中繪制界面。 每一個UIAbility實例,都對應于一個最近任務列表中的任務。 一個應用可以有一個UIAbility,也可以有多個UIAbility。 一個UIAbility可以對應于多個頁面。

  • UIAbility&Window生命周期

  • UIAbility的啟動模式

    是指UIAbility實例在啟動時的不同呈現狀態。針對不同的業務場景,系統提供了三種啟動模式:

    • singleton(單實例模式)
    • multiton(多實例模式)
    • specified(指定實例模式)
import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';export default class EntryAbility extends UIAbility {onCreate(want, launchParam) {hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');}onDestroy() {hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');}onWindowStageCreate(windowStage: window.WindowStage) {// Main window is created, set main page for this abilityhilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');windowStage.loadContent('pages/Index', (err, data) => {if (err.code) {hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');return;}hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');});}onWindowStageDestroy() {// Main window is destroyed, release UI related resourceshilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');}onForeground() {// Ability has brought to foregroundhilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');}onBackground() {// Ability has back to backgroundhilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');}
}
路由配置
{"src": ["pages/Index","pages/routes/FirstPage","pages/routes/SecondPage","pages/routes/WebComponent"]
}

3.3 ArkUI

ArkUI的基本單元是組件,組件是一個獨立子頁面或者子模塊。示例代碼有注釋,包含頁面UI組件,狀態,route跳轉。

組件聲明周期

import router from '@ohos.router'@Entry //@Entry表示該自定義組件為入口組件
@Component //@Component表示自定義組件
struct Index {//@State表示組件中的狀態變量,狀態變量變化會觸發UI刷新@State count: number = 1@State url: string = "https://img1.baidu.com/it/u=3302184040,3713353210&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500"private product: string[] = ['PC。', "平板。", `手環。`]//UI描述:以聲明式的方式來描述UI的結構,例如build()方法中的代碼塊。build() {//系統組件:ArkUI框架中默認內置的基礎和容器組件,比如示例中的Row、Column、Text//不允許在UI描述里直接使用聲明局部變量// let a = 1 ERRORRow() {Column() {Button("Page跳轉").onClick(()=>{router.pushUrl({ url: "pages/routes/FirstPage", params: {param: "第一個頁面傳來的值",} })})Button("Webview跳轉").onClick(()=>{router.pushUrl({ url: "pages/routes/WebComponent", params: {param: "第一個頁面傳來的值",} })})Text(this.count.toString())//屬性方法:組件可以通過鏈式調用配置多項屬性,如fontSize()、width()、height()、backgroundColor()等.fontWeight(FontWeight.Bold)//定義擴展原生組件樣式.setCustomText(30)}}}
}

3.4 Webview

在原生APP組件開發過程中,很多活動頁面都是h5實現,但是需要很多原生的能力,比如相機,這種情況下就需要類似JsBridge方式的WebView

import webView from '@ohos.web.webview';@Entry
@Component
struct WebComponent {controller: webView.WebviewController = new webView.WebviewController();webUrl: string = 'https://www.baidu.com/'jsBridge = {callNaMethod() {console.log("H5調用Native方法")}}aboutToAppear(){webView.WebviewController.setWebDebuggingAccess(true)}build() {Stack() {//加載網絡url// Web({ src: this.webUrl, controller: this.controller })//加載本地htmlWeb({ src: $rawfile("demo.html"), controller: this.controller })//允許訪問本地文件.fileAccess(true)//設置是否允許執行JavaScript腳本.javaScriptAccess(true)//注入JavaScript對象到window對象中,并在window對象中調用該對象的方法.javaScriptProxy({object: this.jsBridge,name: "jsBridge",methodList: ["callNaMethod"],controller: this.controller}).onPageEnd(event => {//異步執行JavaScript腳本 調用H5方法this.controller.runJavaScript("callH5Method()").then(result => {console.log(`H5返回值=${result}`)}).catch(error => {console.error("error: " + error);})})}}
}
測試html
<!DOCTYPE html><html><body><!--調用原生方法-->
<button type="button" onclick="window.jsBridge.callNaMethod()">點擊調用原生界面方法</button>
</body><script type="text/javascript">function callH5Method() {return "從H5返回"}
</script>
</html>

3.5 Devtools調試webview

  1. 代碼中允許webview調試 web_webview.WebviewController.setWebDebuggingAccess(true);
// xxx.ets
import web_webview from '@ohos.web.webview';@Entry
@Component
struct WebComponent {controller: web_webview.WebviewController = new web_webview.WebviewController();aboutToAppear() {// 配置web開啟調試模式web_webview.WebviewController.setWebDebuggingAccess(true);}build() {Column() {Web({ src: 'www.example.com', controller: this.controller })}}
}
  1. 用hdc命令行工具

(需要全局設置path /Users/你的用戶名/Library/Huawei/Sdk/hmscore/3.1.0/toolchains/)

// 添加映射 hdc fport tcp:9222 tcp:9222 // 查看映射 hdc fport ls
  1. 在PC端chrome瀏覽器地址欄中輸入chrome://inspect/#devices,頁面識別到設備后,就可以開始頁面調試。調試效果如下:

總結

鴻蒙整體上開發很像Kotlin Compose,有經驗的很容易上手。

為了能讓大家更好的學習鴻蒙 (Harmony OS) 開發技術,這邊特意整理了《鴻蒙 (Harmony OS)開發學習手冊》(共計890頁),希望對大家有所幫助:https://qr21.cn/FV7h05

《鴻蒙 (Harmony OS)開發學習手冊》

入門必看:https://qr21.cn/FV7h05

  1. 應用開發導讀(ArkTS)
  2. 應用開發導讀(Java)

HarmonyOS 概念:https://qr21.cn/FV7h05

  1. 系統定義
  2. 技術架構
  3. 技術特性
  4. 系統安全

如何快速入門:https://qr21.cn/FV7h05

  1. 基本概念
  2. 構建第一個ArkTS應用
  3. 構建第一個JS應用
  4. ……

開發基礎知識:https://qr21.cn/FV7h05

  1. 應用基礎知識
  2. 配置文件
  3. 應用數據管理
  4. 應用安全管理
  5. 應用隱私保護
  6. 三方應用調用管控機制
  7. 資源分類與訪問
  8. 學習ArkTS語言
  9. ……

基于ArkTS 開發:https://qr21.cn/FV7h05

  1. Ability開發
  2. UI開發
  3. 公共事件與通知
  4. 窗口管理
  5. 媒體
  6. 安全
  7. 網絡與鏈接
  8. 電話服務
  9. 數據管理
  10. 后臺任務(Background Task)管理
  11. 設備管理
  12. 設備使用信息統計
  13. DFX
  14. 國際化開發
  15. 折疊屏系列
  16. ……

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209956.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209956.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209956.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[Linux] 基于LAMP架構安裝論壇

一、安裝Discuz論壇 1.1 創建數據庫&#xff0c;并進行授權 mysql -u root -p123CREATE DATABASE bbs; #創建一個數據庫GRANT all ON bbs.* TO bbsuser% IDENTIFIED BY admin123; #把bbs數據庫里面所有表的權限授予給bbsuser,并設置密碼admin123flush privileges; #刷新數據庫…

Java 中的抽象類與接口:深入理解與應用

文章目錄 什么是抽象類&#xff1f;什么是接口&#xff1f;抽象類和接口的使用場景抽象類和接口的區別結論 在 Java 編程語言中&#xff0c;抽象類和接口是兩種重要的機制&#xff0c;用于實現抽象化和多態性。這兩種機制都允許我們定義一種通用的類型&#xff0c;然后通過繼承…

數據結構——棧與棧排序

棧的特性 棧是一種遵循后進先出&#xff08;LIFO&#xff09;原則的數據結構。其基本操作包括&#xff1a; push&#xff1a;將元素添加到棧頂。pop&#xff1a;移除棧頂元素。peek&#xff1a;查看棧頂元素&#xff0c;但不移除。 棧排序的原理 棧排序的核心是使用兩個棧&…

[滲透測試學習] Devvortex - HackTheBox

文章目錄 信息搜集解題步驟提交flag 信息搜集 掃描端口 nmap -sV -sC -p- -v --min-rate 1000 10.10.11.242發現80端口有http服務&#xff0c;并且是nginx服務 嘗試訪問web界面&#xff0c;發現跳轉到http://devvortex.htb/無法訪問 我們用vim添加該域名即可 sudo vim /etc/…

J.408之數據結構

J-408之數據結構_北京信息科技大學第十五屆程序設計競賽&#xff08;同步賽&#xff09; (nowcoder.com) 思維好題&#xff0c;直接用兩個set存沒出現的數字就好了 // Problem: 408之數據結構 // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/68572/J // Me…

ClickHouse安裝和部署

ClickHouse安裝過程&#xff1a; ClickHouse支持運行在主流64位CPU架構&#xff08;X86、AArch和PowerPC&#xff09;的Linux操作 系統之上&#xff0c;可以通過源碼編譯、預編譯壓縮包、Docker鏡像和RPM等多種方法進行安裝。由于篇幅有限&#xff0c;本節著重講解離線RPM的安…

RAW和YUV的區別

RAW是指未經過任何壓縮或處理的原始圖像數據。在攝像頭中&#xff0c;原始圖像數據可以是來自圖像傳感器的未經處理的像素值。這些原始數據通常以一種Bayer模式的形式存在&#xff0c;其中每個像素僅包含一種顏色信息&#xff08;紅色、綠色或藍色&#xff09;&#xff0c;需要…

【開源】基于Vue和SpringBoot的在線課程教學系統

項目編號&#xff1a; S 014 &#xff0c;文末獲取源碼。 \color{red}{項目編號&#xff1a;S014&#xff0c;文末獲取源碼。} 項目編號&#xff1a;S014&#xff0c;文末獲取源碼。 目錄 一、摘要1.1 系統介紹1.2 項目錄屏 二、研究內容2.1 課程類型管理模塊2.2 課程管理模塊2…

Redis Bitmaps 數據結構模型位操作

Bitmaps 數據結構模型 Bitmap 本身不是一種數據結構&#xff0c;實際上它就是字符串&#xff0c;但是它可以對字符串的位進行操作。 比如 “abc” 對應的 ASCII 碼分別是 97、98、99。對應的二進制分別是 01100010、01100010、01100011, 如下所示&#xff1a; a b …

HTML5+CSS3+JS小實例:文字依次點擊驗證

實例:文字依次點擊驗證 技術棧:HTML+CSS+JS 效果: 源碼: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=&quo…

十七、FreeRTOS之FreeRTOS事件標志組

本節需要掌握以下內容&#xff1a; 1&#xff0c;事件標志組簡介&#xff08;了解&#xff09; 2&#xff0c;事件標志組相關API函數介紹&#xff08;熟悉&#xff09; 3&#xff0c;事件標志組實驗&#xff08;掌握&#xff09; 4&#xff0c;課堂總結&#xff08;掌握&am…

04_W5500_TCP_Server

上一節我們完成了TCP_Client實驗&#xff0c;這節使用W5500作為服務端與TCP客戶端進行通信。 目錄 1.W5500服務端要做的&#xff1a; 2.代碼分析&#xff1a; 3.測試&#xff1a; 1.W5500服務端要做的&#xff1a; 服務端只需要打開socket&#xff0c;然后監聽端口即可。 2…

基于Spring Boot的水產養殖管理系統

文章目錄 項目介紹主要功能截圖:部分代碼展示設計總結項目獲取方式?? 作者主頁:超級無敵暴龍戰士塔塔開 ?? 簡介:Java領域優質創作者??、 簡歷模板、學習資料、面試題庫【關注我,都給你】 ??文末獲取源碼聯系?? 項目介紹 基于Spring Boot的水產養殖管理系統,jav…

HarmonyOS Developer——鴻蒙【構建第一個JS應用(FA模型)】

創建JS工程 JS工程目錄結構 構建第一個頁面 構建第二個頁面 實現頁面間的跳轉 使用真機運行應用 說明 為確保運行效果&#xff0c;本文以使用DevEco Studio 3.1 Release版本為例&#xff0c;點擊此處獲取下載鏈接。 創建JS工程 若首次打開DevEco Studio&#xff0c;請點擊…

蝦皮什么商品好賣

在蝦皮&#xff08;Shopee&#xff09;平臺上&#xff0c;有許多商品類別都表現出了較好的銷售情況。然而&#xff0c;隨著時間和地區的變化&#xff0c;熱銷商品也會有所不同。本文將介紹一些在蝦皮平臺上表現較好的商品類別&#xff0c;并提供一些建議&#xff0c;幫助您在蝦…

交換機基本原理和配置

目錄 一、數據鏈路層功能 二、交換機的工作原理 三、交換機的四大功能 一、數據鏈路層功能 位于網絡層與物理層之間 數據鏈路的建立、維護與拆除幀包裝、幀傳輸、幀同步幀的差錯恢復流量控制 二、交換機的工作原理 交換機通過數據幀的源 MAC 地址&#xff0c;學習到交換機端…

偶數位字符前置算法

題目描述&#xff1a; 題目描述 編寫函數void myshift(char *s),在不打亂s原本相對位置情況下&#xff0c;將偶數位上的字符全部挪到奇數位字符的前面。輸入格式 輸入一個字符串 s保證輸入字符串 s 的長度大于等于1小于等于100輸出格式 輸出修改后的字符串 s。輸入樣例1 01234…

【算法】直接插入排序

目錄 1. 說明2. 舉個例子3. java代碼示例4. java示例截圖 1. 說明 1.直接插入排序的方式和打牌一樣&#xff0c;剛開始數組為空 2.拿到一個數字后從左到右將它與數組中的每一個數字進行比較&#xff0c;然后插入合適的位置 3.到最后&#xff0c;數組按照既定的順序排序好 2. 舉…

OpenCV基礎篇

OpenCV基礎篇 一、圖像、視頻讀取二、cv::Mat()數據類型三、繪圖功能四、鼠標響應事件五、圖像像素讀寫六、圖像像素運算七、顏色空間轉換八、圖像幾何變換九、圖像濾波十、圖像二值化十一、圖像梯度十二、Canny邊緣檢測十三、圖像形態學十四、圖像直方圖十五、霍夫變換十六、分…

線程池的拒絕策略

文章目錄 線程池的拒絕策略AbortPolicy拒絕策略&#xff1a;CallerRunsPolicy拒絕策略&#xff1a;DiscardOldestPolicy拒絕策略&#xff1a;DiscardPolicy拒絕策略&#xff1a; 線程池的拒絕策略 若在線程池當中的核心線程數已被用完且阻塞隊列已排滿&#xff0c;則此時線程池…