?、移動應(yīng)?開發(fā)的介紹
移動應(yīng)?開發(fā):
- Android
- IOS
- HarmonyOS (鴻蒙)
?、HarmonyOS介紹
文檔概覽-HarmonyOS應(yīng)用開發(fā)官網(wǎng)
2.1 系統(tǒng)的定義
2.1.1 系統(tǒng)的定位
HarmonyOS有三?特征:
- 搭載該操作系統(tǒng)的設(shè)備在系統(tǒng)層?融為?體、形成超級終端,讓設(shè)備的硬件能?可以彈性 擴展,實現(xiàn)設(shè)備之間 硬件互助,資源共享。 對消費者??,HarmonyOS能夠?qū)?活場景中的各類終端進?能?整合,實現(xiàn)不同終端 設(shè)備之間的快速連接、能?互助、資源共享,匹配合適的設(shè)備、提供流暢的全場景體驗。
- ?向開發(fā)者,實現(xiàn)?次開發(fā),多端部署。 對應(yīng)?開發(fā)者??,HarmonyOS采?了多種分布式技術(shù),使應(yīng)?開發(fā)與不同終端設(shè)備的 形態(tài)差異?關(guān),從?讓開發(fā)者能夠聚焦上層業(yè)務(wù)邏輯,更加便捷、?效地開發(fā)應(yīng)?。
- ?套操作系統(tǒng)可以滿?不同能?的設(shè)備需求,實現(xiàn)統(tǒng)?OS,彈性部署。 對設(shè)備開發(fā)者??,HarmonyOS采?了組件化的設(shè)計?案,可根據(jù)設(shè)備的資源能?和業(yè) 務(wù)特征靈活裁剪,滿?不同形態(tài)終端設(shè)備對操作系統(tǒng)的要求。
2.1.2 系統(tǒng)架構(gòu)
- 內(nèi)核層:提供?機操作系統(tǒng)的基礎(chǔ)能?。HarmonyOS采?多內(nèi)核的系統(tǒng)設(shè)計,基于 Linux內(nèi)核、LiteOS,使?了Linux的微內(nèi)核(使?了Linux的最簡功 能)
- Linux內(nèi)核: ?機操作系統(tǒng)的內(nèi)核
- LiteOS內(nèi)核:智能硬件的內(nèi)核
- 系統(tǒng)服務(wù)層:HarmonyOS的核?能?集合,這些能?是有系統(tǒng)本身決定的,為我們應(yīng)? 開發(fā)提供了服務(wù)調(diào)?功能。系統(tǒng)服務(wù)層提供的能?是可以被我們開發(fā)的應(yīng)?進?調(diào)?的。
- 框架層:為HarmonyOS的應(yīng)?開發(fā)提供了不同語?程序調(diào)?的接?
2.2 鴻蒙發(fā)展史
2.2.1 “鴻蒙”
盤古開天辟地——??混沌(鴻蒙時代) ?志要在?機系統(tǒng)的國產(chǎn)化道路上開天辟地
2.2.2 發(fā)展史
- 2012年,華為開始規(guī)劃智能操作系統(tǒng)“鴻蒙”
- 2019年5?,華為申請“鴻蒙”商標
- 2019年5?17?,發(fā)布鴻蒙系統(tǒng)
- 2019年8?,鴻蒙正式版發(fā)布,實?開源
- 2020年9?,鴻蒙2.0(beta)
- 2021年6?2?晚上,華為線上發(fā)布HarmonyOS 2.0---?機
2.3 鴻蒙與安卓的區(qū)別
2.3.1 內(nèi)核
- 安卓:基于Linux的內(nèi)核設(shè)計,對Linux的依賴很?(也就是說Android操作系統(tǒng)?多數(shù)功能都 是依賴Linux)
- 鴻蒙:采?了多內(nèi)核設(shè)計,Linux內(nèi)核+LiteOS內(nèi)核,操作系統(tǒng)最?限度的依賴Linux內(nèi)核
2.3.2 運?效率
-
安卓:應(yīng)?的運?是基于虛擬機的 (Java---JDK編譯器---字節(jié)碼---虛擬機---操作系統(tǒng))
-
鴻蒙:??編譯器 (Java----??編譯器---機器碼---操作系統(tǒng))
據(jù)說, 鴻蒙系統(tǒng)運?效率相較于安卓提升了50%+
2.4 技術(shù)特性 與 系統(tǒng)安全
2.4.1 技術(shù)特性
- 硬件互助,資源共享
- ?次開發(fā),多端部署
- 統(tǒng)?OS,彈性部署
2.4.2 系統(tǒng)安全
- 正確的?:?效安全的?戶身份識別
- 正確的設(shè)備:設(shè)備的識別
- 正確的使?數(shù)據(jù):數(shù)據(jù)的安全
三、第?個鴻蒙應(yīng)?
3.1 開發(fā)準備
3.1.1 開發(fā)環(huán)境搭建(Java)
- 安裝JDK、配置環(huán)境變量
- 下載安裝DevEco Studio集成開發(fā)環(huán)境(基于Idea開發(fā)的專??于鴻蒙應(yīng)?開發(fā)的IDE)
下載地址
華為操作系統(tǒng)DevEco Studio和SDK下載與升級 | HarmonyOS開發(fā)者
安裝
- 運行安裝包
- 點擊Next
- 選擇安裝目錄
- 創(chuàng)建桌面快捷方式
- 開始安裝
運行DevEco Studio
第一次啟動開發(fā)環(huán)境會下載鴻蒙開發(fā)所需要的SDK
- 雙擊桌?快捷?式,打開DevEco Studio
- 開始使?
- 選擇SDK?錄
- 點擊Next進?下?步
- 選擇Accept,點擊Next開始下載SDK
- 點擊Finish完成下載,開始使?
3.1.2 注冊華為帳號
注冊_華為帳號 (huawei.com)
3.2 創(chuàng)建鴻蒙應(yīng)?
3.3 鴻蒙應(yīng)??錄結(jié)構(gòu)
3.4 運?項?
3.4.1 啟動鴻蒙模擬器
- Tools—Device Manager
- 在彈出的窗?裝點擊 Login 按鈕,登錄華為帳號
- 啟動?個模擬器
3.5 鴻蒙應(yīng)?的啟動流程
3.5.1 config.json
config.json 是鴻蒙應(yīng)?的主配置?件
- app 配置 :定義當(dāng)前應(yīng)?的唯?標識
- bundleName應(yīng)用的唯一標識(一般包名用公司名+應(yīng)用名稱)
- version 應(yīng)?的版本
- module 配置: ?于聲明當(dāng)前應(yīng)?的信息(包、主類、主界?、功能模塊聲明、適配設(shè) 備類型等等)
-
mainAbility聲明當(dāng)前應(yīng)用啟動時默認加載的Ability
-
deviceType聲明當(dāng)前應(yīng)用適配的設(shè)備類型
-
abilities 聲明當(dāng)前應(yīng)?中每個ability的配置信息
- 創(chuàng)建一個ability那么在config.json中會自動生成對應(yīng)的ability的配置信息。
-
3.5.2 應(yīng)?啟動流程
-
啟動鴻蒙應(yīng)?加載config.json?件,根據(jù)?
mainAbility?
配置加載啟動應(yīng)?的主界?"mainAbility": "com.example.myapplication.demo01.MainAbility"
-
執(zhí)?MainAbility的 onStart ?法
MainAbility是?個顯示界?的容器,在
onStart
?法中通過調(diào)? setMainRoute ?法來指 定當(dāng)前界?容器中顯示的視圖界?// ability相當(dāng)于一個容器(或者說是瀏覽器窗口), // 在容器里面通過填充一個視圖slice(html中的body)來展示。 // MainAbilitySlice就是?個界? super.setMainRoute(MainAbilitySlice.class.getName());
-
執(zhí)?MainAbilitySlice中的?
onStart
?完成界?的渲染slice是?個界?,界?中顯示什么視圖,就是通過onstart?法來加載渲染的
3.5.3 你好,世界哪里來的
$string : 表示引用的一sing,表示要去string文件中尋找鍵值對,如圖尋找key為:mainability_HelloWorld 的值。
四、Ability框架
4.1 Ability介紹
Ability是應(yīng)?所具備能?的抽象,也是應(yīng)?程序的重要組成部分。?個應(yīng)?可以具備多種能?
(即可以包含多個Ability),HarmonyOS?持應(yīng)?以Ability為單位進?部署。
Ability可以分為?FA(Feature Ability)
?和PA (Particle Ability)
?兩種類型,每種類型為
開發(fā)者提供了不同的模板,以便實現(xiàn)不同的業(yè)務(wù)功能。
-
FA?持Page Ability:
Page模板是FA唯??持的模板,?于提供與?戶交互的能?。?個Page實例可以包含?
組相關(guān)??,每個????個AbilitySlice實例表示。
??
-
PA?持Service Ability和Data Ability:
- Service模板:?于提供后臺運?任務(wù)的能?。
- Data模板:?于對外部提供統(tǒng)?的數(shù)據(jù)訪問抽象。
4.2 PageAbility
4.2.1PageAbility簡介
?個PageAbility相當(dāng)于?個??的容器(瀏覽器窗?),?個AbilitySlice相當(dāng)于顯示在容器
中的?個??(HTML)
Page模板(以下簡稱“Page”)是FA唯??持的模板,?于提供與?戶交互的能?。?個Page可以由?個或多個AbilitySlice構(gòu)成,AbilitySlice是指應(yīng)?的單個??及其控制邏輯的總和(相當(dāng)于?個HTML?件)。在?個Abiliy種可以包含多個Slice
商品管理: ProductAbility(PageAbility): goods-list.html ProductListSlice goods-detail.html ProductDetailSlice
4.2.2 創(chuàng)建AbilitySlice
-
AbilitySlice創(chuàng)建slice包中
-
創(chuàng)建步驟:
-
創(chuàng)建?個類繼承 ohos.aafwk.ability.AbilitySlice 類
public class MainAbilitySlice2 extends AbilitySlice { }
-
在?
resources/base/layout
??錄下創(chuàng)建布局?件<?xml version="1.0" encoding="utf-8"?> <DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:height="match_parent" ohos:width="match_parent" ohos:orientation="vertical"> <Text ohos:height="match_content" ohos:width="match_content" ohos:text="這是測試?本" ohos:text_color="#ff0000" ohos:text_size="40vp"></Text> </DirectionalLayout>
-
在創(chuàng)建的 AbilitySlice 類中重寫 onStart ?法,調(diào)?setUIContent?法加載布局?件
通過 ResourceTable 加載resouces?錄下的資源
public class MainAbilitySlice2 extends AbilitySlice { @Override protected void onStart(Intent intent) { super.onStart(intent); //定義slice視圖組件(Java,XML) //setUIContent(int); 加載應(yīng)?的 布局?件(xml) 作為當(dāng)前slice的視圖 setUIContent(ResourceTable.Layout_ability_main_slice2); } }
-
4.2.3 PageAbility?命周期
?個Page中可以包含多個Slice,但是只能同時顯示?個slice,如何設(shè)置PageAbility默認
顯示的slice?
在?個Page Ability中提供了多個聲明周期?法,這些?法在當(dāng)前PageAbility加載的不同
階段會?定調(diào)?
說明
INACTIVE狀態(tài)是一種短暫存在的狀態(tài),可理解為“激活中”。
public class MainAbility extends Ability { /** * 當(dāng)系統(tǒng)?次創(chuàng)建當(dāng)前PageAbility實例時,?動調(diào)?onstart?法。也就是說對于?個Page??,onStart?法只會執(zhí)??次 */ public void onStart(Intent intent) { super.onStart(intent); super.setMainRoute(MainAbilitySlice2.class.getName()); System.out.println("--------------onStart"); } /** * 當(dāng)前Page進?active狀態(tài)進?到?機前臺獲取焦點時,會觸發(fā)onActive?法的執(zhí)? */ protected void onActive() { super.onActive(); System.out.println("--------------onActive"); } /** * 當(dāng)前PageAbility失去焦點(??切?到后臺、切換到其他Page),觸發(fā)onInactive?法的執(zhí)? */ protected void onInactive() { super.onInactive(); System.out.println("--------------onInactive"); } /** * 當(dāng)前PageAbility切換到后臺,不可?時,觸發(fā)onBackground執(zhí)? */ protected void onBackground() { super.onBackground(); System.out.println("--------------onBackground"); } /** * 當(dāng)PageAbility從后臺不可?狀態(tài)(??在后臺、但是沒銷毀)切換到前臺可?狀態(tài)時觸發(fā) onForeground執(zhí)? */ protected void onForeground(Intent intent) { super.onForeground(intent); System.out.println("--------------onForeground"); } /** * 當(dāng)前Page銷毀時,觸發(fā)onStop的執(zhí)? */ protected void onStop() { super.onStop(); System.out.println("--------------onStop"); } }
4.2.4 Slice的兩種渲染方式
Slice相當(dāng)于一個網(wǎng)頁,Slice中顯示的視圖是通過組件來聲明的,Slice中的組件加載支持兩種方式:
- Java代碼
- xml布局文件
onStart
方法:在Slice實例創(chuàng)建時執(zhí)行,用于載入當(dāng)前Slice的視圖組件,在onStart方法中通過調(diào)用setUIContext
來加載視圖組件
setUIContext方法提供了2個重載:
setUIContext(int):通過布局?件的ID,加載resources/base/layout?錄下的布局?件
完成??的渲染
setUIContext(ComponentContainer) :通過加載?個使?Java代碼創(chuàng)建的組件完成??
的渲染
XML****?式渲染
-
創(chuàng)建布局?件:ability_main_slice2.xml
<?xml version="1.0" encoding="utf-8"?> <DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:height="match_parent" ohos:width="match_parent" ohos:orientation="vertical"> <Text ohos:height="match_content" ohos:width="match_content" ohos:text="這是測試文本" ohos:text_color="#ff0000" ohos:text_size="40vp"></Text> </DirectionalLayout>
-
在Slice的onStart?法中加載布局?件:
每創(chuàng)建一個布局文件(或者說每個資源都會創(chuàng)建一個ID)都會生成一個ID,所以布局文件調(diào)用的是setUIContext(int)方法
@Override protected void onStart(Intent intent) { super.onStart(intent); // 定義slice視圖組件(java,xml) // setUIContent(int); 加載應(yīng)用的 布局文件(xml)作為當(dāng)前slice的試圖 super.setUIContent(ResourceTable.Layout_ability_main_slice2); }
Java?式渲染
-
使?Java代碼創(chuàng)建組件,渲染到slice中
public class MainAbilitySlice2 extends AbilitySlice { @Override protected void onStart(Intent intent) { super.onStart(intent); // 定義slice視圖組件(java,xml) // setUIContent(int); 加載應(yīng)用的 布局文件(xml)作為當(dāng)前slice的試圖 // super.setUIContent(ResourceTable.Layout_ability_main_slice2); // ComponentContainer(組件容器) DirectionalLayout directionalLayout = new DirectionalLayout(this); directionalLayout.setOrientation(Component.DRAG_VERTICAL); // Component(組件) Text text = new Text(this); text.setText("Hello Boys"); text.setHeight(40); text.setTextSize(40); // 將組件放到組件容器中 directionalLayout.addComponent(text); // 將組件容器渲染到slice中 setUIContent(directionalLayout); } }
4.2.5 AbilitySlice間導(dǎo)航
?個PageAbility可以包含多個Slice,同?時刻只能顯示?個Slice,但是可以在不同的
Slice之間進?跳轉(zhuǎn)——AbilitySlice間的導(dǎo)航
-
在MainAbilitySlice中添加按鈕,并監(jiān)聽按鈕的點擊事件(略 參考4.3)
-
創(chuàng)建SecondAbilitySlice(略)
<?xml version="1.0" encoding="utf-8"?> <DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:height="match_parent" ohos:width="match_parent" ohos:orientation="vertical"> <!-- 將圖片文件存到resource/base/media目錄 PS:文件的名字不要用數(shù)字開頭,因為名字會作為變量名 --> <Image ohos:height="match_content" ohos:width="match_parent" ohos:image_src="$media:cat"> </Image> </DirectionalLayout>
public class SecondAbilitySlice extends AbilitySlice { @Override protected void onStart(Intent intent) { super.onStart(intent); this.setUIContent(ResourceTable.Layout_ability_second); } }
-
在MainAbilitySlice中監(jiān)聽按鈕的點擊事件,導(dǎo)航到SecondAbilitySlice
public class MainAbilitySlice extends AbilitySlice { @Override public void onStart(Intent intent) { super.onStart(intent); // 在當(dāng)前slice中渲染試圖組件有2中方式: // 1. 基于Java代碼的渲染 // 2. 基于xml標簽渲染,例如: super.setUIContent(ResourceTable.Layout_ability_main); super.setUIContent(ResourceTable.Layout_ability_main); // 1. 獲取id=btn1的按鈕組件 Button btn1 = (Button) this.findComponentById(ResourceTable.Id_btn1); // 2.設(shè)置按鈕事件監(jiān)聽 MainAbilitySlice _this = this; // a.創(chuàng)建事件監(jiān)聽器 Component.ClickedListener clickedListener = new Component.ClickedListener() { @Override public void onClick(Component component) { //挑轉(zhuǎn)到SecondAbilitySlice // 從this指代的當(dāng)前slice跳轉(zhuǎn)到new的slice中 _this.present(new SecondAbilitySlice(), new Intent()); } }; // b.設(shè)置組件的事件監(jiān)聽 btn1.setClickedListener(clickedListener); } }
簡化版本
public class MainAbilitySlice extends AbilitySlice { @Override public void onStart(Intent intent) { super.onStart(intent); // 在當(dāng)前slice中渲染試圖組件有2中方式: // 1. 基于Java代碼的渲染 // 2. 基于xml標簽渲染,例如: super.setUIContent(ResourceTable.Layout_ability_main); super.setUIContent(ResourceTable.Layout_ability_main); // 1. 獲取id=btn1的按鈕組件 Button btn1 = (Button) this.findComponentById(ResourceTable.Id_btn1); // //b.設(shè)置組件的事件監(jiān)聽 PS:簡化成lambda表達示 // PS:簡化成lambda表達式 因為listener要實現(xiàn)onclick方法 // btn1.setClickedListener(clickedListener->{ // present(new SecondAbilitySlice(), new Intent() ); // }); // b.設(shè)置組件的事件監(jiān)聽 因為只有一個方法,可以省略大括號 btn1.setClickedListener(clickedListener -> present(new SecondAbilitySlice(), new Intent())); } }
4.2.6 Slice之間的傳值問題
使?Intent對象實現(xiàn)slice間的傳值
-
MainAbilitySlice
public class MainAbilitySlice extends AbilitySlice { @Override public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); // 1. 獲取id=btn1的按鈕組件 Button btn1 = (Button) this.findComponentById(ResourceTable.Id_btn1); // b.設(shè)置組件的事件監(jiān)聽 btn1.setClickedListener(clickedListener -> { // 在跳轉(zhuǎn)之前的slice將需要傳遞的數(shù)據(jù)設(shè)置到Intent對象中 Intent intent1 = new Intent(); intent1.setParam("productId", "101"); present(new SecondAbilitySlice(), intent1); }); } }
-
SecondAbilitySlice
public class SecondAbilitySlice extends AbilitySlice { @Override protected void onStart(Intent intent) { super.onStart(intent); this.setUIContent(ResourceTable.Layout_ability_second); // 在跳轉(zhuǎn)后的slice的onStart方法中,從intent對象中獲取數(shù)據(jù) if (intent != null) { // 因為intent.getParam()返回的是IntentParams, 所以先獲取IntentParams然后再獲取值 IntentParams params = intent.getParams(); String productId = (String) params.getParam("productId"); // 獲取到id=text1的文本組件 Text text = (Text) findComponentById(ResourceTable.Id_text1); // 將獲取到的商品ID設(shè)置到text文本組件 text.setText(productId); } } }
4.3 組件的事件監(jiān)聽
4.3.1 在MainAbilitySlice布局文件添加按鈕
<?xml version="1.0" encoding="utf-8"?> <DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:height="match_parent" ohos:width="match_parent" ohos:alignment="center" ohos:orientation="vertical"> <Image ohos:height="match_content" ohos:width="match_content" ohos:image_src="$media:icon"> </Image> <Text ohos:id="$+id:text_helloworld" ohos:height="match_content" ohos:width="match_content" ohos:background_element="$graphic:background_ability_main" ohos:layout_alignment="horizontal_center" ohos:text="$string:mainability_HelloWorld" ohos:text_size="40vp"/> <Button ohos:id="$+id:btn1" ohos:height="match_content" ohos:width="match_parent" ohos:padding="5vp" ohos:text="點我試試!" ohos:text_size="40vp" ohos:background_element="#a0b0c0"></Button> </DirectionalLayout>
當(dāng)我們在Button使用$+id:btn1
時,這個組件就會在ResourceTable中產(chǎn)生一個唯一標識
4.3.2 監(jiān)聽按鈕的點擊事件
-
在加載布局文件的Slice類中,獲取按鈕組件,設(shè)置點擊事件的監(jiān)聽器文章來源:http://www.zghlxwxcb.cn/news/detail-431218.html
package com.example.myapplicationdemo01.slice; import com.example.myapplicationdemo01.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 { @Override public void onStart(Intent intent) { super.onStart(intent); // 在當(dāng)前slice中渲染試圖組件有2中方式: // 1. 基于Java代碼的渲染 // 2. 基于xml標簽渲染,例如: super.setUIContent(ResourceTable.Layout_ability_main); super.setUIContent(ResourceTable.Layout_ability_main); // 1. 獲取id=btn1的按鈕組件 Button btn = (Button) this.findComponentById(ResourceTable.Id_btn1); // 2.設(shè)置按鈕事件監(jiān)聽 // a.創(chuàng)建事件監(jiān)聽器 Component.ClickedListener clickedListener = new Component.ClickedListener(){ @Override public void onClick(Component component) { System.out.println("--------觸發(fā)了點擊事件"); } }; // b.設(shè)置組件的事件監(jiān)聽 btn.setClickedListener(clickedListener); } }
-
可以使用同一個監(jiān)聽器監(jiān)聽多個組件的事件,如果點擊不同的組件執(zhí)行的業(yè)務(wù)不同,則可以通過組件判斷來執(zhí)行不同的業(yè)務(wù)文章來源地址http://www.zghlxwxcb.cn/news/detail-431218.html
// 1. 獲取id=btn1的按鈕組件 Button btn1 = (Button) this.findComponentById(ResourceTable.Id_btn1); Button btn2 = (Button) this.findComponentById(ResourceTable.Id_btn2); // 2.設(shè)置按鈕事件監(jiān)聽 // a.創(chuàng)建事件監(jiān)聽器 Component.ClickedListener clickedListener = new Component.ClickedListener(){ @Override public void onClick(Component component) { // Component參數(shù) 表示監(jiān)聽的組件 if (component == btn1) { System.out.println("--------aaa"); } else if (component == btn2) { System.out.println("~~~~~~~~bbb"); } } }; // b.設(shè)置組件的事件監(jiān)聽 btn1.setClickedListener(clickedListener);// 輸出aaa btn2.setClickedListener(clickedListener);// 輸出bbb
到了這里,關(guān)于手把手教你開發(fā)第一個HarmonyOS (鴻蒙)移動應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!