今天我們來談談當下最火爆的萬物互聯的操作系統—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時,又能夠回到第一張圖的界面。