鴻蒙HarmonyOS應(yīng)用開發(fā):從零開始開發(fā)HarmonyOS應(yīng)用
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz
2020年9月10日,HarmonyOS 2.0的發(fā)布對于IT界來說又是一件翹首以盼的大事。發(fā)布會上,華為消費者業(yè)務(wù)軟件部總裁王成錄為開發(fā)者帶來了一個全面升級的華為鴻蒙版本,各方面能力的大幅提升,完整的應(yīng)用開發(fā)生態(tài),超級終端的全場景生態(tài),即將開啟移動生態(tài)的下一下新紀元。
在參加完鴻蒙2.0的發(fā)布會后,又周轉(zhuǎn)于9月11日華為聯(lián)合南北向業(yè)務(wù)合作伙伴以及應(yīng)用生態(tài)合作伙伴共同主持的各技術(shù)分論壇活動。作為一名從事移動應(yīng)用相關(guān)產(chǎn)業(yè)近十余年的工作者,自然是對華為鴻蒙2.0提供的完整的應(yīng)用開發(fā)生態(tài)更為感興趣。
《從零開始開發(fā)HarmonyOS應(yīng)用》是華為展示的第一個鴻蒙應(yīng)用示例,示例簡單的介紹了多設(shè)備自適應(yīng)布局、輸入事件處理、和跨設(shè)備流轉(zhuǎn)。
1 創(chuàng)建應(yīng)用工程
使用 DevEco Studio 創(chuàng)建應(yīng)用工程,在菜單欄打開“File>New>New Project”,在彈出的對話框中選擇java工程模板。

選擇好模板之后點擊“Next”,在下一個界面中指定“Project Name”和“Package Name”,然后點擊“Finish”即可建立工程。
一個建立好的工程包含以下目錄:

2 設(shè)計用戶界面
在Java UI框架中,提供了兩種編寫布局的方式:在XML中聲明UI布局和在代碼中創(chuàng)建布局。這兩種方式創(chuàng)建出的布局沒有本質(zhì)差別,此例主要通過XML的方式編寫應(yīng)用的頁面。
2.1 XML編寫頁面
2.1.1 新建XML頁面
在“Project”窗口,打開“entry > src > main > resources > base”,右鍵點擊“base”文件夾,選擇“New > Directory”,命名為“layout”。
右鍵點擊“layout”文件夾,選擇“New > File”命名為“main_layout.xml”。
在“layout”文件夾下可以看到新增了“main_layout.xml”文件。

2.1.2 編寫XML代碼
這個示例中自適應(yīng)布局的實現(xiàn),主要是基于AdaptiveBoxLayout新的布局樣式,它可以將布局在橫豎屏設(shè)備上進行自適應(yīng)分布排列。開發(fā)者可以將布局代碼寫在“main_layout.xml”文件,關(guān)于布局代碼怎樣實現(xiàn)可以參考https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-component-layout-xml-0000000000500395。
如果布局中引用到圖片資源,需要將圖片放到 “resources>base>media ”。


2.2加載XML布局
在“Project”窗口中,選擇“entry > src > main > java > com.huawei.example.helloworld > slice”,打開“MainAbilitySlice.java”文件。重寫onStart()方法加載XML布局,示例代碼如下:
- 1.package com.huawei.example.helloworld.slice;
- 2.import com.huawei.example.helloworld.ResourceTable;
- 3.import ohos.aafwk.ability.AbilitySlice;
- 4.import ohos.aafwk.content.Intent;
- 5.
- 6.public class MainAbilitySlice extends AbilitySlice {
- 7.
- 8. @Override
- 9. public void onStart(Intent intent) {
- 10. super.onStart(intent);
- 11. super.setUIContent(ResourceTable.Layout_main_layout); // 加載XML布局
- 12. }
- 13.
- 14. @Override
- 15. public void onActive() {
- 16. super.onActive();
- 17. }
- 18.
- 19. @Override
- 20. public void onForeground(Intent intent) {
- 21. super.onForeground(intent);
- 22. }
- 23.}
應(yīng)用運行效果如圖所示:

3 輸入事件處理
輸入事件包括兩種,一種是觸控事件,一種是按鍵事件。
3.1 觸控事件
組件的一個重要作用是當用戶點擊組件時,會執(zhí)行相應(yīng)的操作或者界面出現(xiàn)相應(yīng)的變化。用戶點擊組件時,組件對象將收到一個點擊事件。開發(fā)者可以自定義響應(yīng)點擊事件的方法。例如,通過創(chuàng)建一個Component.ClickedListener對象,然后通過調(diào)用setClickedListener將其分配給組件。示例代碼如下:
- 1. //1.先導入ohos.agp.components.Image
- 2. //2.從定義的xml中獲取Image對象
- 3. Image remote = (Image) findComponentById(ResourceTable.Id_remote);
- 4. //3.為Image設(shè)置點擊事件回調(diào)
- 5. remote.setClickedListener(component -> {
- 6. //4.此處添加點擊按鈕后的事件處理邏輯
- 7. migrateAbility();
- 8. });
3.2 按鍵點擊事件
當設(shè)備按鍵按下時,相應(yīng)的Ability對象將收到一個KeyEvent事件。開發(fā)者可以自定義響應(yīng)點擊事件的方法。
一個示例代碼如下:
- 1.public boolean onKeyEvent(Component component, KeyEvent keyEvent) {
- 2. if (keyEvent.isKeyDown()
- 3. && keyEvent.getKeyCode() == KeyEvent.KEY_DPAD_CENTER
- 4. && component.getId() == ResourceTable.Id_remote) {
- 5. continueAbility();
- 6. return true;
- 7. }
- 8. return false;
- 9.}
4 跨設(shè)備流轉(zhuǎn)
4.1 申請權(quán)限
權(quán)限即系統(tǒng)用于控制第三方應(yīng)用或服務(wù)訪問用戶敏感個人數(shù)據(jù)或操作敏感能力的授權(quán)方式,當?shù)谌綉?yīng)用或服務(wù)嘗試訪問用戶個人數(shù)據(jù)或操作敏感能力時,系統(tǒng)通過彈窗的形式請求用戶授權(quán)。用戶可授權(quán)此應(yīng)用使用相關(guān)權(quán)限,后續(xù)也可取消此授權(quán)。例如打車類應(yīng)用為了定位,在獲取用戶的地理位置信息前需向用戶申請,用戶同意此應(yīng)用使用,后續(xù)也可取消此授權(quán)。
當使用“流轉(zhuǎn)”功能需要申請遷移權(quán)限D(zhuǎn)ISTRIBUTED_DATASYNC。
4.1.1 在config.json中聲明權(quán)限
- 1. "reqPermissions": [
- 2. {
- 3. "name": "ohos.permission.DISTRIBUTED_DATASYNC"
- 4. }
- 5. ]
4.1.2 在MainAbilitySlice.java中請求權(quán)限
- 1.private void migrateAbility() {
- 2. if (verifySelfPermission(SystemPermission.DISTRIBUTED_DATASYNC)
- 3. == IBundleManager.PERMISSION_GRANTED) {
- 4. this.continueAbility();
- 5. } else {
- 6. requestPermission(SystemPermission.DISTRIBUTED_DATASYNC);
- 7. }
- 8.}
4.2 跨設(shè)備流轉(zhuǎn)
僅continueAbility一行代碼即可完成應(yīng)用在設(shè)備之間流轉(zhuǎn),依托的還是鴻蒙OS的分布式軟總線、分布式數(shù)據(jù)庫的能力。在此基礎(chǔ)上將這些能力通過接口的形式提供開發(fā)者。
事實上流轉(zhuǎn)并非“一行代碼可以完成”,如果開發(fā)者想在流轉(zhuǎn)過程中做更多的事情,那么可以通過IAbilifyContinuation接口中的方法進行實現(xiàn)。
IAbilityContinuation接口方法說明如下:
接口名稱說明
Ability以及AbilitySlice都需要實現(xiàn)IAbilityContinuation接口,并實現(xiàn)其中的方法。示例代碼如下 :
- 1. @Override
- 2. public boolean onStartContinuation() {
- 3. return true;
- 4. }
- 5.
- 6. @Override
- 7. public boolean onSaveData(IntentParams intentParams) {
- 8. return true;
- 9. }
- 10.
- 11. @Override
- 12. public boolean onRestoreData(IntentParams intentParams) {
- 13. return true;
- 14. }
- 15.
- 16. @Override
- 17. public void onCompleteContinuation(int i) {
- 18.
- 19. }
通過示例講解及代碼開發(fā)過程解讀,新的布局管理,新的資源文件結(jié)構(gòu),預(yù)示更為簡潔且功能更為強大的應(yīng)用開發(fā)生態(tài)已經(jīng)誕生。相信豐富的系統(tǒng)API將帶給我們開發(fā)者更多的便利及更強大的能力。
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz