日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

鸿蒙APP开发基础知识

發布時間:2023/12/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 鸿蒙APP开发基础知识 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鴻蒙開發基礎知識目錄

  • DevEco Studio編輯器de使用
    • 創建新項目
    • 打開一個項目
    • 新建一個文件夾
    • 新建一個布局文件
    • 新建一個Page Ability(Feature Ability)
    • 配置Ability
    • 設置自己的名字和時間
    • 設置字體大小
    • DevEco Studio編輯器de常用快捷鍵
      • 代碼查找
      • 代碼注釋
      • 手動代碼聯想
      • 快速對代碼進行格式化
      • 對文件進行重命名
  • 鴻蒙項目和Android項目的對比
    • 資源文件
      • 資源文件介紹
      • 資源文件的使用
        • elemen元素資源的創建
        • XML引用資源文件
        • Java引用資源文件
        • 為Element資源文件添加注釋或特殊標識
    • config.json應用配置文件
      • "app"、"deviceConfig"
      • "module"
      • 配置系統的權限
    • 限定詞目錄
      • 限定詞目錄的命名
      • 限定詞目錄與設備狀態的匹配規則
  • 日志工具
    • 日志工具的使用
    • 日志工具類
    • 調試

DevEco Studio編輯器de使用

DS與AS在視覺和使用上大同小異,也有代碼智能補齊、代碼錯誤檢查、代碼自動跳轉等功能,本節主要就DevEco Studio的使用(或使用技巧)做一個歸納(會一直更新哦~)。

創建新項目

打開一個項目

新建一個文件夾

新建一個布局文件

在 src\main\resources\base\layout 目錄下,右鍵點擊 layout 目錄 , 在彈出的菜單中選擇New選項,再選擇Layout Resource File

在彈出的對話框中,輸入布局文件名稱,以及選擇布局類型(目前只能生成DirectionalLayout 線性布局)后,點擊Finish完成創建

生成的布局文件如下

在該布局文件中,自動添加了線性布局 DirectionalLayout 作為根布局

<?xml version="1.0" encoding="utf-8"?> <DirectionalLayoutxmlns:ohos="http://schemas.huawei.com/res/ohos"ohos:height="match_parent"ohos:width="match_parent"ohos:orientation="vertical"></DirectionalLayout>

新建一個Page Ability(Feature Ability)

Page Ability可以理解為安卓的Acitvity
在你想創建Ability的文件上右鍵,New>Ability>Empty Page Ability(Java)

在彈出的對話框中填寫相應信息后,點擊Finish

新的Page Ability與其對應的layout就創建好了呀

可以看見,在鴻蒙應用中在創建頁面時,會生成兩個類:“MyAbility”和“MyAbilitySlice”,和一個布局文件“ability_my.xml”。
想了解這三個文件,可以看本人的從零開始看鴻蒙代碼文件的文章。

配置Ability

創建了一個新的Ability以后,會在config.json中的"abilities"標簽下自動添加新的Ability的配置,如下:

{"orientation": "unspecified","name": "com.example.myapplication.MyAbility","icon": "$media:icon","description": "$string:myability_description","label": "entry","type": "page","launchType": "standard" }

對Ability配置的解讀參照本文章后面config.json 應用配置文件

設置自己的名字和時間

File>Settings…

/*** * @author Xxx* @date ${DATE}*/

設置字體大小

File>Settings…
然后選擇Editor>Font

DevEco Studio編輯器de常用快捷鍵

代碼查找

全局查找:ctrl+shift+F
局部查找:ctrl+F

代碼注釋

注釋代碼(或者對已注釋的代碼塊取消注釋):Ctrl+/

手動代碼聯想

手動代碼聯想需要重新設置快捷鍵
File>Settings

Keymap>Main menu>Code>Completion>Basic

在 Basic 上點擊右鍵,選擇Add Keyboard Shortcut添加鍵盤快捷鍵

然后在彈窗內,輸入快捷鍵Alt+/后,點擊OK(當然你也可以設置自己習慣的快捷鍵)

這時候你會發現,這里有兩個快捷鍵,所以我們需要刪除Ctrl+空格快捷鍵

在 Basic 上點擊右鍵,選擇Remove Ctrl+空格,刪除該快捷鍵

最后Apply一下就OK啦

快捷鍵就可以使用了呀

快速對代碼進行格式化

Ctrl+Alt+L

對文件進行重命名

Shift+F6

鴻蒙項目和Android項目的對比

(部分為自己創建的文件夾)

資源文件

資源文件介紹

資源文件(官方文檔):
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/basic-resource-file-categories-0000001052066099

資源文件的使用

官方文檔:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/basic-resource-file-example-0000001051733014

elemen元素資源的創建

包括字符串、整型數、顏色、樣式等資源的json文件。每個資源均由json格式進行定義,例如:
boolean.json:布爾型
color.json:顏色
float.json:浮點型
intarray.json:整型數組
integer.json:整型
pattern.json:樣式
plural.json:復數形式
strarray.json:字符串數組
strings.json:字符串值

先在element文件夾下New一個File

然后取好名字點擊OK

這樣就創建好了一個新的boolean.json

然后模仿原有的string.json寫一個存放boolean類型的json
boolean.json(布爾型)示例

{"boolean":[{"name":"boolean_true","value":true},{"name":"boolean_true_copy","value":"$boolean:boolean_true"}] }

其他元素資源也可以模仿著寫
color.json(顏色)示例

{"color":[{"name":"cyan","value":"#00FFFF"},{"name":"cyan_copy","value":"$color:cyan"},{"name":"white","value":"#FFFFFFFF"}] }

float.json(浮點型)示例

{"float":[{"name":"float_1","value":"3.19"},{"name":"float_copy","value":"$float:float_1"},{"name":"float_px","value":"100px"}] }

integer.json(整型)示例

{"integer":[{"name":"integer_1","value":1},{"name":"integer_2","value":2},{"name":"integer_3","value":3}] }

intarray.json(整型數組)示例

{"intarray":[{"name":"intarray_1","value":[100,200,"$integer:integer_3"]}] }

strings.json(字符串值)示例

{"string": [{"name": "app_name","value": "MyApplication"},{"name": "mainability_description","value": "Java_Phone_Empty Feature Ability"},{"name": "HelloWorld","value": "Hello World"},{"name": "myability_description","value": "Java_Phone_Empty Feature Ability"},{"name": "page","value": "This is a page."},{"name": "button","value": "This is a button."}] }

strarray.json(字符串數組)示例

{"strarray":[{"name":"strarray_num","value":[{"value":"one"},{"value":"$string:HelloWorld"},{"value":"two"},{"value":"three"}]}] }

pattern.json(樣式)示例

{"pattern":[{"name":"base","value":[{"name":"width","value":"100vp"},{"name":"text_size","value":"100fp"},{"name":"size","value":"25px"}]},{"name":"child","parent":"base","value":[{"name":"noTitile","value":"Yes"}]}] }

plural.json(復數形式)示例

{"plural":[{"name":"eat_apple","value":[{"quantity":"one","value":"%d apple"},{"quantity":"other","value":"%d apples"}]}] }

XML引用資源文件

通過一個示例來解釋
現在有一個xml布局如下

<?xml version="1.0" encoding="utf-8"?> <DirectionalLayoutxmlns:ohos="http://schemas.huawei.com/res/ohos"ohos:height="match_parent"ohos:width="match_parent"ohos:orientation="vertical"><Textohos: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:app_name"ohos:text_color="$color:white"ohos:text_size="50"/><Buttonohos:id="$+id:button"ohos:height="match_content"ohos:width="match_content"ohos:background_element="$graphic:background_ability_main"ohos:layout_alignment="center"ohos:padding="10fp"ohos:text="$string:button"ohos:text_color="$color:white"ohos:text_size="19fp"ohos:top_margin="10fp"/> </DirectionalLayout>

圖中框出的就是XML引用資源文件的方式(引用的資源文件如前節elemen元素資源的創建

ohos:text="$string:button"

這句話的意思就是,在XML文件中,引用string.json文件中類型為“String”、名稱為“button”的資源
一般來說,XML文件引用資源文件的格式如下:
$type:name
特別地,如果引用的是系統資源,則采用:
$ohos:type:name

ohos:text="$ohos:string:request_location_reminder_content"ohos:text_color="$ohos:color:id_color_bottom_tab_bg_blur"


效果如下:

其實在xml中,點擊色塊是可以直接選擇顏色的哦~

Java引用資源文件

通過一個示例來解釋
現有一個MainAbilitySlice.java如下
(ability_main.xml如前節XML引用資源文件,引用的資源文件如前節elemen元素資源的創建

public class MainAbilitySlice extends AbilitySlice {@Overridepublic void onStart(Intent intent) {super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_main);// 加載XML布局Text text = (Text) findComponentById(ResourceTable.Id_text_helloworld);Button button = (Button) findComponentById(ResourceTable.Id_button);ResourceManager rsManager = this.getResourceManager();try {int intColor = rsManager.getElement(ResourceTable.Color_cyan).getColor();Color color = new Color(intColor);text.setTextColor(color);text.setText(rsManager.getElement(ResourceTable.String_HelloWorld).getString());button.setTextColor(new Color(this.getResourceManager().getElement(ResourceTable.Color_cyan_copy).getColor()));} catch (IOException e) {e.printStackTrace();} catch (NotExistException e) {e.printStackTrace();} catch (WrongTypeException e) {e.printStackTrace();}}@Overridepublic void onActive() {super.onActive();}@Overridepublic void onForeground(Intent intent) {super.onForeground(intent);} }

圖中框出的就是JAVA引用資源文件的方式

ResourceManager rsManager = this.getResourceManager(); text.setText(rsManager.getElement(ResourceTable.String_HelloWorld).getString());

這句話的意思就是,在Java文件中,引用string.json文件中類型為“String”、名稱為“String_HelloWorld”的資源
注意:
在使用getElement的時候,一定要用try/catch包起來

一般來說,Java引用資源文件的格式如下:
ResourceTable.type_name
特別地,如果引用的是系統資源,則采用:
ohos.global.systemres.ResourceTable.type_name

text_ohos.setText(this.getResourceManager().getElement(ohos.global.systemres.ResourceTable.String_request_location_reminder_title).getString()); text_ohos.setTextColor(new Color(this.getResourceManager().getElement(ohos.global.systemres.ResourceTable.Color_id_color_badge_red).getColor()));

效果:

如果你在xml或者java中引用的系統資源顯示為一串數字,有可能是你的DS不是最新版本!!!!
截至2021.4.21,官方文檔中明確表明目前支持的系統資源文件為:

xml中可以引用到的為:

Java引用profile資源文件,去獲取profile中的文件內容:


//代碼獲取profile資源Resource resource = getResourceManager().getResource(ResourceTable.Profile_profile_text);InputStreamReader inputStreamReader = new InputStreamReader(resource, "UTF-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String profileText = "";while ((profileText = bufferedReader.readLine()) != null) {text_profile.setText(profileText);}

Java引用rawfile目錄中的資源文件:通過指定文件路徑和文件名稱來引用。
在Java文件中,引用一個路徑為“resources/rawfile/”、名稱為“rawfile_text.txt”的資源文件,示例如下:


//代碼獲取rawfile資源ohos.global.resource.ResourceManager resManager = this.getResourceManager();ohos.global.resource.RawFileEntry rawFileEntry = resManager.getRawFileEntry("resources/rawfile/rawfile_text.txt");InputStreamReader inputStreamReader2 = new InputStreamReader(rawFileEntry.openRawFile(), "UTF-8");//也可以使用這個//InputStreamReader inputStreamReader2 = new InputStreamReader(getResourceManager().getRawFileEntry("resources/rawfile/rawfile_text.txt").openRawFile(), "UTF-8");BufferedReader bufferedReader2 = new BufferedReader(inputStreamReader2);String rawfileText = "";while ((rawfileText = bufferedReader2.readLine()) != null) {text_rawfile.setText(rawfileText);}

為Element資源文件添加注釋或特殊標識

Element目錄下的不同種類元素的資源均采用JSON文件表示,資源的名稱“name”和取值“value”是每一條資源的必備字段。如果需要為某一條資源備注信息,以便于資源的理解和使用,可以通過“comment”字段添加注釋
eg:

{"string": [{"name": "button","value": "This is a button.","comment": "button is this."}] }

string、strarray、plural這三類資源中,可以通過特殊標識來處理無需被翻譯的內容。例如,一個字符串資源的Value取值為“We will arrive at %s”,其中的變量“%s”在翻譯過程中希望保持不變。
法一:在value字段中添加{}。

{"string":[{"name":"message_arrive","value":["We will arrive at",{"id":"time","example":"5:00 am","value":"%s"}]}] }

法二:添加xliff:g</xliff:g>標記對。

{"string":[{"name":"message_arrive","value":"We will arrive at <xliff:g id='time' example='5:00 am'>%s</xliff:g>"}] }

具體使用示例:

<Textohos:id="$+id:string_value"ohos:height="match_content"ohos:width="match_content"ohos:background_element="$graphic:background_ability_main"ohos:layout_alignment="horizontal_center"ohos:text="$string:message_arrive"ohos:text_color="$color:black"ohos:text_size="50"ohos:top_margin="10vp"/><Textohos:id="$+id:string_value2"ohos:height="match_content"ohos:width="match_content"ohos:layout_alignment="horizontal_center"ohos:text="$string:message_arrive2"ohos:text_color="$color:black"ohos:text_size="50"ohos:top_margin="10vp"/><Textohos:id="$+id:string_value3"ohos:height="match_content"ohos:width="match_content"ohos:layout_alignment="horizontal_center"ohos:text="$string:message_arrive3"ohos:text_color="$color:black"ohos:text_size="50"ohos:top_margin="10vp"/><Textohos:id="$+id:string_value4"ohos:height="match_content"ohos:width="match_content"ohos:layout_alignment="horizontal_center"ohos:text="$string:message_arrive4"ohos:text_color="$color:black"ohos:text_size="50"ohos:top_margin="10vp"/><Textohos:id="$+id:string_value5"ohos:height="match_content"ohos:width="match_content"ohos:layout_alignment="horizontal_center"ohos:text="$string:message_arrive5"ohos:text_color="$color:black"ohos:text_size="50"ohos:top_margin="10vp"/><Textohos:id="$+id:string_value6"ohos:height="match_content"ohos:width="match_content"ohos:layout_alignment="horizontal_center"ohos:text="$string:message_arrive6"ohos:text_color="$color:black"ohos:text_size="50"ohos:top_margin="10vp"/><Textohos:id="$+id:string_value_xliff"ohos:height="match_content"ohos:width="match_content"ohos:background_element="$graphic:background_ability_main"ohos:layout_alignment="horizontal_center"ohos:text="$string:message_arrive_xliff"ohos:text_color="$color:white"ohos:text_size="50"ohos:top_margin="10vp"/>

//string的value字段text_string_value.setText(rsManager.getElement(ResourceTable.String_message_arrive).getString("20:00"));text_string_value2.setText(rsManager.getElement(ResourceTable.String_message_arrive2).getString(6, "7:00"));text_string_value3.setText(rsManager.getElement(ResourceTable.String_message_arrive3).getString(10));text_string_value4.setText(rsManager.getElement(ResourceTable.String_message_arrive4).getString(1, 2));text_string_value5.setText(rsManager.getElement(ResourceTable.String_message_arrive5).getString(5));text_string_value6.setText(rsManager.getElement(ResourceTable.String_message_arrive6).getString(3, 4));text_string_value_xliff.setText(rsManager.getElement(ResourceTable.String_message_arrive_xliff).getString("000"));

{"string": [{"name": "message_arrive","value": ["1We will arrive at ",{"id": "time","value": "%s","example": "5:00 am"}]},{"name": "message_arrive2","value": ["2.1We will arrive at ",{"id": "time","value": "%s","example": "5:00 am"},"2.2We will arrive at ",{"id": "time","value": "%s","example": "5:00 am"}]},{"name": "message_arrive3","value": [{"id": "time","value": "3We will arrive at %s","example": "5:00 am"}]},{"name": "message_arrive4","value": ["4.1We will arrive at %s",{"id": "time","value": "4.2We will arrive at %s","example": "5:00 am"}]},{"name": "message_arrive5","value": ["5We will arrive at %s"]},{"name": "message_arrive6","value": ["6.1We will arrive at %s","6.2We will arrive at %s"]},{"name": "message_arrive_xliff","value": "We will arrive at <xliff:g id='time' example='5:00 am'>%s</xliff:g>"}] }

config.json應用配置文件

配置文件的元素(官方文檔):https://developer.harmonyos.com/cn/docs/documentation/doc-guides/basic-config-file-elements-0000000000034463
DS的config.json就相當于AS的AndroidManifest.xml

主要的分為三個部分:app、deviceConfig、module
①app表示應用的全局配置信息
②deviceConfig包含在具體設備上的應用配置信息
③module表示HAP包的配置信息(可以理解為當前模塊的配置信息)

“app”、“deviceConfig”

“module”


值得一提的是

在abilities對象的內部結構中,如果在該Ability的“skills”屬性中,“actions”的取值包含 “action.system.home”,“entities”取值中包含“entity.system.home”,則該Ability的icon、label將同時作為應用的icon、label。如果存在多個符合條件的Ability,則取位置靠前的Ability的icon、label作為應用的icon、label。
也就是說,如果你要設置該 Ability 為啟動 Ability,將 config.json 中該 Ability 配置放在"abilities"標簽中第一個,或者在該Ability的“skills”屬性中,“actions”的取值包含 “action.system.home”,“entities”取值中包含“entity.system.home”。

配置系統的權限

在config.json中的"module"下的"reqPermissions"可以配置系統的權限
權限開發指導官方文檔:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/security-permissions-guidelines-0000000000029886
應用權限列表官方文檔:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/security-permissions-available-0000001051089272
安卓中,權限申請過程是:先清單文件靜態聲明,然后根據是否需要版本適配,在代碼中動態申請權限(在Android 6.0之前,只要指明了權限,系統一般都會自動授權,也有需要詢問用戶是否授權,但是在Android 6.0以及后對于危險權限必須用戶同意后才能進行)。
鴻蒙權限申請步驟:
1、靜態聲明
在config.json文件"module"中的"reqPermissions"靜態聲明

"reqPermissions": [{"name": "ohos.permission.CAMERA","reason": "$string:permreason_camera","usedScene": {"ability": ["com.example.myapplication.MainAbility","com.example.myapplication.MyAbility"],"when": "always"}},{...}]

如果需要聲明多個權限就用逗號隔開
①name:必須,填寫需要聲明的權限的名字(可在官方文檔中查找)。
②reason:可選,當申請的權限為user_grant權限時此字段必填。描述申請權限的原因。
③usedScene:可選,當申請的權限為user_grant權限時此字段必填。描述權限使用的場景和時機。ability:可以使用的ability的名稱,when:使用時間(inuse(使用時)、always(始終))。
2、代碼動態申請權限

public class PermreasonAbility extends Ability {//這個常量表示相機權限private static final String PERMISSION_CAMERA = "ohos.permission.CAMERA";//這個常量用來返回的時候找到是申請了哪個權限,用來尋址的private static final int MY_PERMISSIONS_REQUEST_CAMERA = 1001;//這個常量是設置ToastDialog的持續時間private static final int TOAST_DIALOG_DURATION_TIME = 8000;//Logprivate static final HiLogLabel LABEL = new HiLogLabel(HiLog.LOG_APP, 0x00201, "resultValue");// 當系統首次創建Page實例時,觸發該回調// 對于一個Page實例,該回調在其生命周期過程中僅觸發一次@Overridepublic void onStart(Intent intent) {super.onStart(intent);//設置默認展示的AbilitySlicesuper.setMainRoute(PermreasonAbilitySlice.class.getName());}@Overrideprotected void onActive() {super.onActive();//使用ohos.app.Context.verifySelfPermission接口查詢應用是否已被授予該權限if (verifySelfPermission(PERMISSION_CAMERA) != IBundleManager.PERMISSION_GRANTED) {//如果應用權限未被授予//就使用canRequestPermission向系統權限管理模塊查詢某權限是否不再彈框授權了//也就是查詢是否可以申請彈窗授權(動態申請)if (canRequestPermission(PERMISSION_CAMERA)) {//如果可以動態申請(首次申請或者用戶未選擇禁止且不再提示)HiLog.info(LABEL, "授權彈窗");//使用requestPermissionFromUser向系統權限管理模塊申請權限(動態申請權限)//(接口可支持一次申請多個。若下一步操作涉及到多個敏感權限,可以這么用,其他情況建議不要這么用。//因為彈框還是按權限組一個個去彈框,耗時比較長。用到哪個權限就去申請哪個)requestPermissionsFromUser(new String[]{PERMISSION_CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA);} else {//如果不可動態申請,說明已被用戶或系統永久禁止授權,可以結束權限申請流程//顯示應用權限需要權限的理由,提示用戶進入設置授權HiLog.info(LABEL, "相機權限已被拒絕,請前往設置授予相機權限");new ToastDialog(this).setText("相機權限已被拒絕,請前往設置授予相機權限").setDuration(TOAST_DIALOG_DURATION_TIME).show();}} else {//如果權限已被授予,可以結束權限申請流程。HiLog.info(LABEL, "相機權限已被授予");new ToastDialog(this).setText("相機權限已被授予").setDuration(TOAST_DIALOG_DURATION_TIME).show();}}//通過重寫ohos.aafwk.ability.Ability的回調函數onRequestPermissionsFromUserResult接收授予結果/*** 調用requestPermissionsFromUser后的應答接口** @param requestCode requestPermission中傳入的requestCode* @param permissions 申請的權限名* @param grantResults 申請權限的結果*/@Overridepublic void onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults) {switch (requestCode) {// 匹配requestPermissions的requestCodecase MY_PERMISSIONS_REQUEST_CAMERA: {if (grantResults.length > 0&& grantResults[0] == IBundleManager.PERMISSION_GRANTED) {// 權限被授予// 注意:因時間差導致接口權限檢查時有無權限,所以對那些因無權限而拋異常的接口進行異常捕獲處理HiLog.info(LABEL, "已授予相機權限");} else {// 權限被拒絕HiLog.info(LABEL, "相機權限申請被拒絕");}return;}}}//當Page失去焦點時,系統將調用此回調@Overrideprotected void onInactive() {super.onInactive();} }


值得一提的是,敏感權限的申請需要按照動態申請流程向用戶申請授權,非敏感權限不涉及用戶的敏感數據或危險操作,僅需在config.json中聲明,應用安裝后即被授權,受限開放的權限通常是不允許三方應用申請的。

限定詞目錄

限定詞目錄可以由一個或多個表征應用場景或設備特征的限定詞組合而成(有語言、國家或地區、屏幕密度等維度)。限定詞目錄需要開發者自行創建,但需要遵循限定詞目錄的命名要求以及與限定詞目錄與設備狀態的匹配規則。
官方文檔:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/basic-resource-file-categories-0000001052066099(進入后搜索限定詞目錄)

限定詞目錄的命名

移動國家碼_移動網絡碼-語言_文字_國家或地區-橫豎屏-設備類型-深色模式-屏幕密度
開發者可以根據應用的使用場景和設備特征,選擇其中的一類或幾類限定詞組成目錄名稱。需要注意的是,語言、文字、國家或地區之間采用下劃線連接,移動國家碼和移動網絡碼之間也采用下劃線連接,除此之外的其他限定詞之間均采用中劃線連接。eg:zh_CN-phone-ldpi(設備使用的語言類型為中文,用戶所在的國家或地區為中國,設備的類型是手機,設備的屏幕密度是大規模的屏幕密度)。限定詞取值要求參照官方文檔

限定詞目錄與設備狀態的匹配規則

在為設備匹配對應的資源文件時,限定詞目錄匹配的優先級從高到低依次為:移動國家碼和移動網絡碼 > 區域(語言_文字_國家或地區)> 橫豎屏 > 設備類型 > 顏色模式 > 屏幕密度。
如果限定詞目錄中包含移動國家碼和移動網絡碼、語言、文字、橫豎屏、設備類型、顏色模式限定詞,則對應限定詞的取值必須與當前的設備狀態完全一致,該目錄才能夠參與設備的資源匹配。

日志工具

日志工具的使用

HarmonyOS提供了HiLog日志系統
在輸出日志前,需要先調用HiLog的輔助類HiLogLabel定義日志標簽
使用HiLogLabel(int type, int domain, String tag)定義日志標簽,其中包括了日志類型、業務領域和TAG。

private static final HiLogLabel LABEL = new HiLogLabel(HiLog.LOG_APP, 0x00201, "resultValue");

參數type:用于指定輸出日志的類型。HiLog中當前只提供了一種日志類型,即應用日志類型LOG_APP。
參數domain:用于指定輸出日志所對應的業務領域,取值范圍為0x0~0xFFFFF,開發者可以根據需要進行自定義。一般情況下,我們建議把這 5 個 16 進制數分成兩組,前面三個數表示應用中的模塊編號,后面兩個表示模塊中的類的編號。
參數tag:用于指定日志標識,可以為任意字符串,建議標識調用所在的類或者業務行為。
開發者可以根據自定義參數domain和tag來進行日志的篩選和查找。
HiLog中定義了五種日志級別,并提供了對應的方法用于輸出不同級別的日志
DEBUG:調試信息。默認不輸出,輸出前需要在設備的“開發人員選項”中打開“USB調試”開關。
INFO:INFO級別日志表示普通的信息。
WARN:WARN級別日志表示存在警告
ERROR:ERROR級別日志表示存在錯誤
FATAL:FATAL級別日志表示出現致命錯誤、不可恢復錯誤
例如輸出一條INFO級別的信息:
HiLog.info?(HiLogLabel label, String format, Object... args)
示例代碼:

HiLog.info(LABEL,"The program is running...");String url = "www.baidu.com"; int errno = 0; HiLog.warn(LABEL, "Failed to visit %{private}s, reason:%{public}d.", url, errno);HiLog.error(LABEL, "Failed to visit %{public}s, reason:%d.", url, errno);

參數label:定義好的HiLogLabel標簽。
參數format:格式字符串,用于日志的格式化輸出。格式字符串中可以設置多個參數,例如格式字符串為“Failed to visit %s”,“%s”為參數類型為string的變參標識,具體取值在args中定義。每個參數需添加隱私標識,分為{public}或{private},默認為{private}。{public}表示日志打印結果可見;{private}表示日志打印結果不可見,輸出結果為。
參數args:可以為0個或多個參數,是格式字符串中參數類型對應的參數列表。參數的數量、類型必須與格式字符串中的標識一一對應。
開發者可以在HiLog窗口查看日志信息。可通過設置設備、進程、日志級別和搜索關鍵詞來篩選日志信息。搜索功能支持使用正則表達式,可通過搜索自定義的業務領域值和TAG來篩選日志信息。


(有時候設置標簽過濾會有問題,也可以使用搜索框過濾)

日志工具類

在實際開發中,可以寫一個工具類來對日志做一個適當封裝,方便調用、打印日志和調試程序。
日志封裝類

package com.example.myapplication;import ohos.hiviewdfx.HiLog; import ohos.hiviewdfx.HiLogLabel;/*** 日志打印** @author 舒小羽* @date 2021/3/20 0025*/ public class HiLogUtils {//日志標識public static final String TAG = "MY_TAG";//定義日志標簽(日志類型、業務領域和TAG)private static final HiLogLabel LABEL = new HiLogLabel(ohos.hiviewdfx.HiLog.LOG_APP, 0x00201, TAG);//是否打印日志public static boolean flag = true;//通過flag來控制是否打開日志public static void setPrint(boolean isPrint) {flag = isPrint;}//打印DEBUG類型日志。LABEL為日志標簽,msg為日志內容public static void d(String msg) {if (flag) {HiLog.debug(LABEL, msg);}}//打印INFO類型日志。LABEL為日志標簽,msg為日志內容public static void i(String msg) {if (flag) {HiLog.info(LABEL, msg);}}//打印WARN類型日志。LABEL為日志標簽,msg為日志內容public static void w(String msg) {if (flag) {HiLog.warn(LABEL, msg);}}//打印ERROR類型日志。LABEL為日志標簽,msg為日志內容public static void e(String msg) {if (flag) {HiLog.error(LABEL, msg);}}//打印FATAL類型日志。LABEL為日志標簽,msg為日志內容public static void f(String msg) {if (flag) {HiLog.fatal(LABEL, msg);}} }

實際調用

public class MyAbilitySlice extends AbilitySlice {@Overridepublic void onStart(Intent intent) {super.onStart(intent);super.setUIContent(ResourceTable.Layout_ability_my);HiLogUtils.d("debug");HiLogUtils.i("info");HiLogUtils.w("wran");HiLogUtils.e("error");HiLogUtils.f("fatal");} }

輸出效果

調試

這里介紹的是使用模擬器進行調試。
官方文檔:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_emulator-0000001115721921
第一步:調試前的檢查
在啟動Feature模塊的調試前,請檢查Feature模塊下的config.json文件的abilities數組是否存在“visible”屬性,如果不存在,請手動添加,并將該屬性取值為true,否則Feature模塊的調試無法進入斷點。Entry模塊的調試不需要做該檢查(下圖只是示例“visible”屬性的位置)。
然后就是需要啟動模擬器!!

第二步:設置斷點(如果需要設置斷點調試的話)
選定要設置斷點的有效代碼行,在行號(比如:28行、29行)的區域后,單擊鼠標左鍵設置斷點(如圖示的紅點)。

設置斷點后,調試能夠在正確的斷點處中斷,并高亮顯示該行。
第三步:點擊Debug
在工具欄點擊Debug

然后在彈窗中,選擇設備,點擊OK

現在就可以進行調試了呀~
(如果Debug報錯,請參考本人的鴻蒙Debug報錯:Could not connect to remote process. Aborting debug session.文章)
下面是一些調試的按鈕說明

在Ability和AbilitySlice中都是可以使用HiLog與調試的
如果需要本文配套代碼的可以去本人的上傳的資源中下載哦!

總結

以上是生活随笔為你收集整理的鸿蒙APP开发基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。