一、背景
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
- 代碼中允許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 })}}
}
- 用hdc命令行工具
(需要全局設置path /Users/你的用戶名/Library/Huawei/Sdk/hmscore/3.1.0/toolchains/)
// 添加映射 hdc fport tcp:9222 tcp:9222 // 查看映射 hdc fport ls
- 在PC端chrome瀏覽器地址欄中輸入chrome://inspect/#devices,頁面識別到設備后,就可以開始頁面調試。調試效果如下:
總結
鴻蒙整體上開發很像Kotlin Compose,有經驗的很容易上手。
為了能讓大家更好的學習鴻蒙 (Harmony OS) 開發技術,這邊特意整理了《鴻蒙 (Harmony OS)開發學習手冊》(共計890頁),希望對大家有所幫助:https://qr21.cn/FV7h05
《鴻蒙 (Harmony OS)開發學習手冊》
入門必看:https://qr21.cn/FV7h05
- 應用開發導讀(ArkTS)
- 應用開發導讀(Java)
HarmonyOS 概念:https://qr21.cn/FV7h05
- 系統定義
- 技術架構
- 技術特性
- 系統安全
如何快速入門:https://qr21.cn/FV7h05
- 基本概念
- 構建第一個ArkTS應用
- 構建第一個JS應用
- ……
開發基礎知識:https://qr21.cn/FV7h05
- 應用基礎知識
- 配置文件
- 應用數據管理
- 應用安全管理
- 應用隱私保護
- 三方應用調用管控機制
- 資源分類與訪問
- 學習ArkTS語言
- ……
基于ArkTS 開發:https://qr21.cn/FV7h05
- Ability開發
- UI開發
- 公共事件與通知
- 窗口管理
- 媒體
- 安全
- 網絡與鏈接
- 電話服務
- 數據管理
- 后臺任務(Background Task)管理
- 設備管理
- 設備使用信息統計
- DFX
- 國際化開發
- 折疊屏系列
- ……