自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

HarmonyOS 項目實戰(zhàn)之通訊錄Demo(JS)

開發(fā) 前端 OpenHarmony
通訊錄demo主要分為聯(lián)系人界面、設置緊急聯(lián)系人、服務卡片3個模塊,分為Java和JS兩個版本,本篇主要講解用盡可能的用純JS去實現(xiàn),實在無法實現(xiàn)的地方采用JS與Java結合。

[[439628]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區(qū)

https://harmonyos.51cto.com

1 簡介

通訊錄demo主要分為聯(lián)系人界面、設置緊急聯(lián)系人、服務卡片3個模塊,分為Java和JS兩個版本,本篇主要講解用盡可能的用純JS去實現(xiàn),實在無法實現(xiàn)的地方采用JS與Java結合。

1.1 原型

感興趣的小伙伴,可以自己根據原型效果自己嘗試著去實現(xiàn)【通訊錄demo簡易原型】。

#星光計劃2.0# HarmonyOS 項目實戰(zhàn)之通訊錄Demo(JS)-鴻蒙HarmonyOS技術社區(qū)#星光計劃2.0# HarmonyOS 項目實戰(zhàn)之通訊錄Demo(JS)-鴻蒙HarmonyOS技術社區(qū)#星光計劃2.0# HarmonyOS 項目實戰(zhàn)之通訊錄Demo(JS)-鴻蒙HarmonyOS技術社區(qū)

1.2 場景延伸

通過學習與練習本demo,可以延伸至以下場景。

#星光計劃2.0# HarmonyOS 項目實戰(zhàn)之通訊錄Demo(JS)-鴻蒙HarmonyOS技術社區(qū)#星光計劃2.0# HarmonyOS 項目實戰(zhàn)之通訊錄Demo(JS)-鴻蒙HarmonyOS技術社區(qū)#星光計劃2.0# HarmonyOS 項目實戰(zhàn)之通訊錄Demo(JS)-鴻蒙HarmonyOS技術社區(qū)

2 功能開發(fā)

2.1 聯(lián)系人列表

2.1.1 實現(xiàn)效果

#星光計劃2.0# HarmonyOS 項目實戰(zhàn)之通訊錄Demo(JS)-鴻蒙HarmonyOS技術社區(qū)

2.1.2 核心代碼

參考:基于JS擴展的類Web開發(fā)范式-組件-容器組件-list

關鍵屬性 indexer=“true”

  1. <!-- list --> 
  2.     <list id="address_list" class="list-wrapper" indexer="true" indexerbubble="true" shapemode="rect" 
  3.           initialindex="0"
  4.         <block for="{{ list_data }}"
  5.             <list-item section="{{ $item.item_section }}" class="todo-item"
  6.                 <div class="item-wrapper" @click="onItemClick($item)" @longpress="onItemLongPress($item)"
  7.                     <image class="item-icon" src="{{ $item.item_icon }}"></image> 
  8.                     <text class="item-name">{{ $item.item_name }}</text> 
  9.                 </div> 
  10.             </list-item> 
  11.         </block> 
  12.     </list> 

2.2 三方跳轉

2.2.1 實現(xiàn)效果

#星光計劃2.0# HarmonyOS 項目實戰(zhàn)之通訊錄Demo(JS)-鴻蒙HarmonyOS技術社區(qū)

2.2.2 js和java通信

js打開三方應用目前還不知道如何操作,我們通過js調java方法來實現(xiàn)跳轉。

JS LocalParticleAbility機制請看官方鏈接:API 6開始支持

參考:JS LocalParticleAbility機制-概述

通過js 獲取到java接口

  1. export default { 
  2.     data: { 
  3.        javaInterface: {} 
  4.     }, 
  5.  
  6.     onInit() { 
  7.         console.log(TAG + " ;onInit())"); 
  8.     }, 
  9.  
  10.     onShow() { 
  11.         console.log(TAG + " ;onShow())"); 
  12.         // onInit生命周期中Java接口對象還未創(chuàng)建完成,請勿在onInit中調用。 
  13.         this.javaInterface = createLocalParticleAbility('com.pvj.addresslistdemo.MyLocalParticleAbility'); 
  14.     } 
  15.      
  16.     onClickPhone() { 
  17.     this.javaInterface.doDial(this.item_phone) 
  18.     }, 
  19.     onClickMail() { 
  20.     this.javaInterface.doMessage(this.item_phone) 
  21.     } 

java實現(xiàn)

  1. public class MyLocalParticleAbility implements LocalParticleAbility { 
  2.     private static MyLocalParticleAbility instance; 
  3.     Context applicationContext; 
  4.     Context context; 
  5.  
  6.     private MyLocalParticleAbility(Context context) { 
  7.         this.context = context; 
  8.         this.applicationContext = context.getApplicationContext(); 
  9.     } 
  10.  
  11.     public static MyLocalParticleAbility getInstance(Context applicationContext) { 
  12.         if (instance == null) { 
  13.             instance = new MyLocalParticleAbility(applicationContext); 
  14.  
  15.         } 
  16.         return instance; 
  17.     } 
  18.  
  19.     /** 
  20.      * 跳轉系統(tǒng)撥打電話界面 
  21.      */ 
  22.     public void doDial(String destinationNum) { 
  23.       ... 
  24.     } 
  25.  
  26.     public void doMessage(String telephone) { 
  27.       .... 
  28.     } 
  29.  

LocalParticleAbility 需要 register與 deregister

  1. public class MainAbility extends AceAbility { 
  2.     @Override 
  3.     public void onStart(Intent intent) { 
  4.         super.onStart(intent); 
  5.         .... 
  6.         MyLocalParticleAbility.getInstance(getContext()).register(this); 
  7.     } 
  8.  
  9.     @Override 
  10.     public void onStop() { 
  11.         super.onStop(); 
  12.         MyLocalParticleAbility.getInstance(getContext()).deregister(this); 
  13.     } 
  14.  } 

 2.2.3 撥打電話與發(fā)送短信

  1. /** 
  2.  * 跳轉系統(tǒng)撥打電話界面 
  3.  */ 
  4. public void doDial(String destinationNum) { 
  5.     Intent intent = new Intent(); 
  6.     Operation operation = new Intent.OperationBuilder() 
  7.         .withAction(IntentConstants.ACTION_DIAL) // 系統(tǒng)應用撥號盤 
  8.         .withUri(Uri.parse("tel:" + destinationNum)) // 設置號碼 
  9.         .withFlags(2) 
  10.         .build(); 
  11.     intent.setOperation(operation); 
  12.     // 啟動Ability 
  13.     context.startAbility(intent, 10); 
  14.  
  15. //發(fā)送短信 
  16. public void doMessage(String telephone) { 
  17.     Intent intent = new Intent(); 
  18.     Operation operation = new Intent.OperationBuilder() 
  19.         .withAction(IntentConstants.ACTION_SEND_SMS) 
  20.         .withUri(Uri.parse("smsto:" + telephone)) // 設置號碼 
  21.         .withFlags(Intent.FLAG_NOT_OHOS_COMPONENT) 
  22.         .build(); 
  23.     intent.setOperation(operation); 
  24.     context.startAbility(intent, 11); 

2.3 緊急聯(lián)系人

2.3.1 實現(xiàn)效果

#星光計劃2.0# HarmonyOS 項目實戰(zhàn)之通訊錄Demo(JS)-鴻蒙HarmonyOS技術社區(qū)

2.3.2 js數(shù)據存儲

js關系型數(shù)據庫: 優(yōu)先用關系型數(shù)據庫,發(fā)現(xiàn) JS從API Version 7開始支持。

js輕量級存儲:

① 它是key-value的存儲的方法,從 API Version 6 開始支持;

參考:數(shù)據管理-輕量級存儲

② 麻煩的是:每次存數(shù)據前,需要取一次,再新增數(shù)據;

在實現(xiàn)服務卡片更新信息時,需要動態(tài)的更新數(shù)據,而java的輕量級存儲與JS存儲的不是同一目錄,目錄改成一致程序出錯,最終只能采用js與java通信,由java側統(tǒng)一完成數(shù)據新增與插入。

2.3.3 java數(shù)據存儲實現(xiàn)

java代碼:

  1. public class MyLocalParticleAbility implements LocalParticleAbility { 
  2.     private static MyLocalParticleAbility instance; 
  3.     private static final HiLogLabel TAG = new HiLogLabel(HiLog.DEBUG, 0x0, MyLocalParticleAbility.class.getName()); 
  4.     Preferences preferences; 
  5.     public static final String KEY = "key_list"
  6.     Context applicationContext; 
  7.     Context context; 
  8.  
  9.     private MyLocalParticleAbility(Context context) { 
  10.         this.context = context; 
  11.         this.applicationContext = context.getApplicationContext(); 
  12.  
  13.         DatabaseHelper databaseHelper = new DatabaseHelper(applicationContext); 
  14.         String fileName = "main_list.xml";  
  15.         // fileName表示文件名,其取值不能為空,也不能包含路徑,默認存儲目錄可以通過context.getPreferencesDir()獲取。 
  16.         preferences = databaseHelper.getPreferences(fileName); 
  17.     } 
  18.  
  19.  
  20.     public static MyLocalParticleAbility getInstance(Context applicationContext) { 
  21.         if (instance == null) { 
  22.             instance = new MyLocalParticleAbility(applicationContext); 
  23.  
  24.         } 
  25.         return instance; 
  26.     } 
  27.  
  28.  
  29.     public String getContactPersonList() { 
  30.         // context入參類型為ohos.app.Context。 
  31.         String preferencesString = preferences.getString(KEY""); 
  32.         HiLog.info(TAG, "getContactPersonList preferencesString : " + preferencesString); 
  33.         return preferencesString; 
  34.     } 
  35.  
  36.  
  37.     public void addContactPersonList(String content) { 
  38.         HiLog.info(TAG, "addContactPersonList content : " + content); 
  39.         preferences.putString(KEY, content); 
  40.         preferences.flushSync(); 
  41.     } 

js代碼:

  1. import prompt from '@system.prompt'
  2.  
  3.  onItemLongPress(item) { 
  4.         console.log(TAG + " ;onItemLongPress:" + item.item_name); 
  5.         let THIS = this; 
  6.         //點擊刪除時彈出對話框 
  7.         prompt.showDialog({ 
  8.             title: "操作提示"
  9.             message: "添加" + item.item_name + "為緊急聯(lián)系人嗎?"
  10.             buttons: [{ 
  11.                           "text""確定"
  12.                           "color""" 
  13.                       }, 
  14.                       { 
  15.                           "text""取消"
  16.                           "color""" 
  17.                       }], 
  18.             success: function (data) { 
  19.                 if (data.index == 0) { 
  20.                     THIS.addContactPersonList(item); 
  21.                 }  
  22.             } 
  23.         }); 
  24.     } 
  25.  
  26.   async addContactPersonList(item) { 
  27.         let content =  await this.getContactPersonList(); 
  28.         console.info(TAG + "addContactPersonList content: " + content); 
  29.  
  30.         let list = [] 
  31.         if(content != ""){ 
  32.             list = JSON.parse(content); 
  33.         } 
  34.         list.push(item); 
  35.         let temp = JSON.stringify(list); 
  36.         console.info(TAG + "addContactPersonList temp: " + temp); 
  37.  
  38.         this.javaInterface.addContactPersonList(temp).then(); 
  39.         return true 
  40.         // store.putSync(keytemp); 
  41.     }, 
  42.    async getContactPersonList() { 
  43.         let ret = await this.javaInterface.getContactPersonList() 
  44.         console.info(TAG + "getContactPersonList ret:" + ret); 
  45.         return ret 
  46.     } 

2.4 js服務卡片

2.4.1 實現(xiàn)效果

2.4.2 創(chuàng)建卡片模板

2.4.3 卡片數(shù)據綁定

  1. public ProviderFormInfo bindFormData(long formId) { 
  2.     HiLog.info(TAG, "bind form data"); 
  3.     ZSONObject zsonObject = new ZSONObject(); 
  4.     String contactPersonList = MyLocalParticleAbility.getInstance(context.getApplicationContext()).getContactPersonList(); 
  5.     JSONArray jsonArray = JSON.parseArray(contactPersonList); 
  6.     for (int i = 0; i < jsonArray.size(); i++) { 
  7.         String name = jsonArray.getJSONObject(i).getString("item_name"); 
  8.         String phone = jsonArray.getJSONObject(i).getString("item_phone"); 
  9.         if (i == 0) { 
  10.             zsonObject.put("titleText"name); 
  11.             zsonObject.put("contentText", phone); 
  12.         } else if (i == 1) { 
  13.             zsonObject.put("titleText1"name);  
  14.             zsonObject.put("contentText1", phone); //傳遞的是string;是否支持其他類型?比如數(shù)組 
  15.         } else { 
  16.             break; 
  17.         } 
  18.         HiLog.info(TAG, "bind form data :" + jsonArray.getJSONObject(i).get("item_name")); 
  19.         HiLog.info(TAG, "bind form data :" + jsonArray.getJSONObject(i).get("item_phone")); 
  20.     } 
  21.  
  22.     ProviderFormInfo providerFormInfo = new ProviderFormInfo(); 
  23.     providerFormInfo.setJsBindingData(new FormBindingData(zsonObject)); 
  24.  
  25.     return providerFormInfo; 

2.4.4 事件處理

  1.   "data": { 
  2.     "appName""緊急聯(lián)系人"
  3.     "contactPersonList"""
  4.     "titleText""Title"
  5.     "contentText""Introduction"
  6.     "titleText1"""
  7.     "contentText1"""
  8.     "actionName1""Action 1"
  9.     "actionName2""Action 2" 
  10.   }, 
  11.   "actions": { 
  12.     "routerEvent": { 
  13.       "action""router"
  14.       "abilityName""com.pvj.addresslistdemo.MainAbility"
  15.       "params": { 
  16.         "message""weather" 
  17.       } 
  18.     }, 
  19.     "callEvent1": { 
  20.       "action""message"
  21.       "params": { 
  22.         "mAction""callEvent1" 
  23.       } 
  24.     }, 
  25.     "callEvent2": { 
  26.       "action""message"
  27.       "params": { 
  28.         "mAction""callEvent2" //  
  29.       } 
  30.     } 
  31.   } 

call 就是前面的播打電話的方法

  1. @Override 
  2. public void onTriggerFormEvent(long formId, String message) { 
  3.     HiLog.info(TAG, "handle card click event." + message); 
  4.  
  5.     ZSONObject zsonObject = ZSONObject.stringToZSON(message); 
  6.  
  7.     // Do something here after receive the message from js card 
  8.     ZSONObject result = new ZSONObject(); 
  9.     switch (zsonObject.getString("mAction")) { 
  10.         case "callEvent1"
  11.             call(0); 
  12.             break; 
  13.         case "callEvent2"
  14.             call(1); 
  15.             break; 
  16.     } 

3 注意事項

Demo還有很多需要完善的地方

刪除時,索引不會被刪除;

索引想要自定義樣式,目前實現(xiàn)不了;

運行在api為7的手機的bug,一開始莫名的#顯示;

純js實現(xiàn)一個應用,目前還是行不通;

js官方文檔上,有些不是很完善和穩(wěn)定,對入門選手極其不友好。

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區(qū)

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區(qū)
相關推薦

2022-01-04 15:34:31

鴻蒙HarmonyOS應用

2011-09-05 14:08:21

微信Andriod安卓

2014-09-24 10:29:14

微信企業(yè)號開發(fā)

2011-09-16 14:05:42

Andrioid應用iPhone應用Symbian應用

2014-09-28 22:30:13

微信企業(yè)號

2014-09-28 22:26:11

微信企業(yè)號

2012-02-09 09:10:44

Path通訊錄隱私

2010-06-18 22:42:42

智能手機平臺Android網秦

2013-03-18 10:19:27

安卓軟件手機通訊錄隱私信息

2012-06-05 13:53:03

天天聯(lián)系華為

2010-09-08 23:11:01

2010-09-26 08:35:01

火種通訊錄

2011-07-20 08:49:24

jQuery MobiAndroid

2012-12-21 14:51:52

手機中國

2015-07-30 15:58:15

EC企信企業(yè)即時通訊

2010-05-12 14:42:20

2017-09-06 14:51:21

Swift

2012-01-09 16:43:13

點心通訊錄

2011-07-19 17:25:14

jQuery MobiAndroid

2011-11-28 14:37:32

點心通訊錄
點贊
收藏

51CTO技術棧公眾號