今天我們來談談當下最火爆的萬物互聯的作業系統—Harmony OS,這是國人的驕傲,也是每一箇中華兒女值得去學習和研究的國產作業系統。在這裡主要是想透過自己所寫的一個小 Demo 來初探一下 Harmony OS 系統下的 app 應用開發,如有不對之處還望指出,共勉之。
Step 1: 開發環境的搭建
IDE & SDK 的安裝就不在這裡詳細講解了,華為的官網上面既有安裝包也有相關的步驟,相信大家可以透過文件自行完成。
Step2: app開發的相關術語學習(摘至華為官網)
第一部分:系統的定義
HarmonyOS 是一款“面向未來”、面向全場景(移動辦公、運動健康、社交通訊、媒體娛樂等)的分散式作業系統。
第二部分:開發app應用程式包結構
HarmonyOS 的使用者應用程式包以APP Pack(Application Package)形式釋出,它是由一個或多個 HAP(HarmonyOS Ability Package)以及描述每個 HAP 屬性的pack.info組成。
HAP 是 Ability 的部署包,HarmonyOS 應用程式碼圍繞 Ability 元件展開。
一個 HAP 是由程式碼、資源、第三方庫及應用配置檔案組成的模組包,可分為 entry 和feature 兩種模組型別。
Entry
entry:應用的主模組。
一個APP中,對於同一裝置型別必須有且只有一個entry型別的HAP,可獨立安裝執行。
Feature
feature:應用的動態特性模組。
一個 APP 可以包含一個或多個 feature 型別的 HAP,也可以不包含。只有包含 Ability 的 HAP 才能夠獨立執行。
Ability
Ability 是應用所具備的能力的抽象,一個應用可以包含一個或多個 Ability。
Ability 分為兩種型別:FA(Feature Ability)和 PA(Particle Ability)。
FA/PA 是應用的基本組成單元,能夠實現特定的業務功能。FA有UI介面,而PA無UI介面。
庫檔案
庫檔案是應用依賴的第三方程式碼(例如so、jar、bin、har等二進位制檔案),存放在 libs 目錄。
資原始檔
應用的資原始檔(字串、圖片、音訊等)存放於 resources 目錄下,便於開發者使用和維護,詳見資原始檔的分類。
配置檔案
配置檔案 (config.json) 是應用的 Ability 資訊,用於宣告應用的 Ability,以及應用所需許可權等資訊,詳見應用配置檔案。
pack.info
描述應用軟體包中每個 HAP 的屬性,由 IDE 編譯生成,應用市場根據該檔案進行拆包和 HAP 的分類儲存。
HAP 的具體屬性包括:
delivery-with-install: 表示該 HAP 是否支援隨應用安裝。“true”:表示支援隨應用安裝;“false”:表示不支援隨應用安裝。
name:HAP 檔名。
module-type:模組型別,entry 或 feature。
device-type:表示支援該 HAP 執行的裝置型別。
HAR(HarmonyOS Ability Resources)可以提供構建應用所需的所有內容,包括原始碼、資原始檔和 config.json 檔案。HAR 不同於 HAP,HAR 不能獨立安裝執行在裝置上,只能作為應用模組的依賴項被引用。
使用者應用程式泛指執行在裝置的作業系統之上,為使用者提供特定服務的程式,簡稱“應用”。
在 HarmonyOS 上執行的應用,有兩種形態:
傳統方式的需要安裝的應用。
提供特定功能,免安裝的應用(即原子化服務)。
第三部分:開發過程中常見的術語解釋
Page 與 AbilitySlice
Page 模板(以下簡稱“Page”)是 FA 唯一支援的模板,用於提供與使用者互動的能力。一個Page 可以由一個或多個 AbilitySlice 構成,AbilitySlice 是指應用的單個頁面及其控制邏輯的總和。
當一個 Page 由多個 AbilitySlice 共同構成時,這些 AbilitySlice 頁面提供的業務能力應具有高度相關性。例如,新聞瀏覽功能可以透過一個 Page 來實現,其中包含了兩個AbilitySlice:一個 AbilitySlice 用於展示新聞列表,另一個 AbilitySlice 用於展示新聞詳情。
Intent
Intent 是物件之間傳遞資訊的載體。例如,當一個 Ability 需要啟動另一個 Ability 時,或者一個 AbilitySlice 需要導航到另一個 AbilitySlice 時,可以透過 Intent 指定啟動的目標同時攜帶相關資料。
Ability
Ability 是應用所具備能力的抽象,也是應用程式的重要組成部分。
一個應用可以具備多種能力(即可以包含多個 Ability ),HarmonyOS 支援應用以 Ability 為單位進行部署。Ability 可以分為 FA(Feature Ability)和 PA(Particle Ability)兩種型別,每種型別為開發者提供了不同的模板,以便實現不同的業務功能。
FA 支援 Page Ability:
Page 模板是 FA 唯一支援的模板,用於提供與使用者互動的能力。一個 Page 例項可以包含一組相關頁面,每個頁面用一個 AbilitySlice 例項表示。
PA 支援 Service Ability 和 Data Ability:
Service 模板:用於提供後臺執行任務的能力。
Data 模板:用於對外部提供統一的資料訪問抽象。
Service Ability 基本概念
基於 Service 模板的 Ability(以下簡稱“Service”)主要用於後臺執行任務(如執行音樂播放、檔案下載等),但不提供使用者互動介面。
Service 可由其他應用或 Ability 啟動,即使使用者切換到其他應用,Service 仍將在後臺繼續執行。Service 是單例項的。在一個裝置上,相同的 Service 只會存在一個例項。如果多個 Ability 共用這個例項,只有當與 Service 繫結的所有 Ability 都退出後,Service 才能夠退出。
由於 Service 是在主執行緒裡執行的,因此,如果在 Service 裡面的操作時間過長,開發者必須在 Service 裡建立新的執行緒來處理(詳見執行緒間通訊),防止造成主執行緒阻塞,應用程式無響應。
Data Ability基本概念
使用 Data 模板的 Ability(以下簡稱“Data”)有助於應用管理其自身和其他應用儲存資料的訪問,並提供與其他應用共享資料的方法。Data 既可用於同裝置不同應用的資料共享,也支援跨裝置不同應用的資料共享。
資料的存放形式多樣,可以是資料庫,也可以是磁碟上的檔案。Data 對外提供對資料的增、刪、改、查,以及開啟檔案等介面,這些介面的具體實現由開發者提供。
備註:以上是一些在進行 Harmony OS app 應用開發過程中會經常涉及到的一些概念的東西,也是非常重要的,有一定的理解後將有利於我們進行系統的開發,所以我整理了一下放到了第二部分。
Step3:Demo 示例講解
第一部分:程式結構與程式入口
如上圖所示:entry 是應用的主模組,
1——標識的地方是 Slice 切片,
2——標識的地方是 main 方法所在的類檔案,
3——標識的地方是存放樣式檔案,
4——標識的地方是存放的佈局檔案。
第二部分:兩個Slice 檔案內容
package com.example.myapplication.slice;
import com.example.myapplication.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Button;
import ohos.agp.components.Component;
public class MainAbilitySlice extends AbilitySlice {
/*
onStart()
當系統首次建立Page例項時,觸發該回調。對於一個Page例項,該回調在其生命週期過程中僅觸發一次,
Page在該邏輯後將進入INACTIVE狀態。開發者必須重寫該方法,並在此配置預設展示的AbilitySlice。
*/
@Override
public void onStart(Intent intent) {
super.onStart(intent);
//ResourceTable相應當selenium中的driver,這裡要是在設定佈局為 ability_main.xml檔案的內容,前面的Layout_是框架規則好的
super.setUIContent(ResourceTable.Layout_ability_main);
//類似於python 中selenium中的透過 id 來查詢元素,這裡的Id_button是ability_main.xml中的button 的id值
Button button = (Button) findComponentById(ResourceTable.Id_button);
//判斷button 是否為null
if(button != null){
//給button 設定click監聽事件
button.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
//這裡相當於是render另一個頁面(這裡傳入了一個SecondAbilitySlice and Intent),實現了頁面的跳轉
present(new SecondAbilitySlice(),new Intent());
}
});
}
}
/*
onActive()
Page會在進入INACTIVE狀態後來到前臺,然後系統呼叫此回撥。Page在此之後進入ACTIVE狀態,
該狀態是應用與使用者互動的狀態。Page將保持在此狀態,除非某類事件發生導致Page失去焦點,
比如使用者點選返回鍵或導航到其他Page。當此類事件發生時,會觸發Page回到INACTIVE狀態,
系統將呼叫onInactive()回撥。此後,Page可能重新回到ACTIVE狀態,系統將再次呼叫onActive()回撥。
因此,開發者通常需要成對實現onActive()和onInactive(),並在onActive()中獲取在onInactive()中被釋放的資源。
*/
@Override
public void onActive() {
super.onActive();
}
/*
onForeground()
處於BACKGROUND狀態的Page仍然駐留在記憶體中,當重新回到前臺時(比如使用者重新導航到此Page),
系統將先呼叫onForeground()回撥通知開發者,而後Page的生命週期狀態回到INACTIVE狀態。
開發者應當在此回撥中重新申請在onBackground()中釋放的資源,最後Page的生命週期狀態進一步回到ACTIVE狀態,
系統將透過onActive()回撥通知開發者使用者。
*/
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
}
package com.example.myapplication.slice;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
//import ohos.global.systemres.ResourceTable;
import com.example.myapplication.ResourceTable;
import ohos.agp.components.Button;
import ohos.agp.components.Component;
import ohos.agp.components.Text;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
public class SecondAbilitySlice extends AbilitySlice {
private static final int MY_MODULE = 200;
@Override
protected void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_second_slice);
Text text = (Text) findComponentById(ResourceTable.Id_second_text);
if(text != null){
String myname = intent.getStringParam("name");
final HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, MY_MODULE, "MY_TAG_Tony"); //MY_MODULE=0x00201
HiLog.info(label, "the myname is:", myname);
}
//這裡跟MailAbilitySlice中的作用一樣,找button元素,這個元素就是Go Back
Button button=(Button) findComponentById(ResourceTable.Id_seconde_button);
if(button != null){
button.setClickedListener(new Component.ClickedListener() {
@Override
public void onClick(Component component) {
present(new MainAbilitySlice(),new Intent());
}
});
}
}
}
第三部分:兩個 Layout 佈局和一個 graphic 檔案內容
備註:
- 表示的是文字框,裡面的 ohos:text 表示文字的內容
- 表示的是按鈕,裡面的 ohos:id 表示元素的id值
- 裡面的 ohos:text 表示按鈕的文字內容
- 裡面的 ohos:background_element 表示背景(就是CSS)
- Graphic 資料夾下存放的是樣式檔案,在Button 和 Text 裡面可以引用這個裡面的樣式,如上圖中的第三張圖所示。
- 在開發過程中,如 layout 目錄下檔名和 id 值及 graphic 目錄下的檔名在IDE中是有聯想選擇的,有的會拼接上一些固定字串。
- Import 匯入第三方包時,一定要注意匯入是正確的,在開發過程中發現有同名包,但是不是我們想要使用的,就會一直報錯。
第四部分:執行後得到的效果圖如下所示(這裡選擇的裝置為 Iphone)
實現的場景非常的簡單,就是點選下面第一張圖中的 Go 時(綁定了 click 監聽事件),就跳轉到如下第二張圖中去,這裡是切換到了另一個 Slice 的 page。當再點選此張圖片中的 Go Back時,又能夠回到第一張圖的介面。