0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于JS擴(kuò)展的類Web開發(fā)范式

OpenHarmony技術(shù)社區(qū) ? 來源:HarmonyOS技術(shù)社區(qū) ? 作者:HarmonyOS技術(shù)社區(qū) ? 2022-01-04 14:52 ? 次閱讀

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

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

https://modao.cc/app/56d61f79d8390a50dbfbd4c0f17fb8a6006692f1#screen=sku2aiuwknvl3jn
通過學(xué)習(xí)與練習(xí)本 demo,可以延伸至以下場景:

功能開發(fā)

①聯(lián)系人列表

實(shí)現(xiàn)效果:

核心代碼參考《基于 JS 擴(kuò)展的類 Web 開發(fā)范式-組件-容器組件-list》:

https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-components-container-list-0000000000611496

關(guān)鍵屬性 indexer=“true”:

 





{{$item.item_name}}

②三方跳轉(zhuǎn)

實(shí)現(xiàn)效果:

js 和 java 通信:js 打開三方應(yīng)用目前還不知道如何操作,我們通過 js 調(diào) java 方法來實(shí)現(xiàn)跳轉(zhuǎn)。

JS LocalParticleAbility 機(jī)制請看官方鏈接:API 6 開始支持。

參考《JS LocalParticleAbility 機(jī)制-概述》:

https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-apis-localparticleability-overview-0000001064156060

通過 js 獲取到 java 接口

exportdefault{
data:{
javaInterface:{}
},

onInit(){
console.log(TAG+";onInit())");
},

onShow(){
console.log(TAG+";onShow())");
// onInit生命周期中Java接口對象還未創(chuàng)建完成,請勿在onInit中調(diào)用。
this.javaInterface=createLocalParticleAbility('com.pvj.addresslistdemo.MyLocalParticleAbility');
}

onClickPhone(){
this.javaInterface.doDial(this.item_phone)
},
onClickMail(){
this.javaInterface.doMessage(this.item_phone)
}
}

java 實(shí)現(xiàn):

publicclassMyLocalParticleAbilityimplementsLocalParticleAbility{
privatestaticMyLocalParticleAbilityinstance;
ContextapplicationContext;
Contextcontext;

privateMyLocalParticleAbility(Contextcontext){
this.context=context;
this.applicationContext=context.getApplicationContext();
}

publicstaticMyLocalParticleAbilitygetInstance(ContextapplicationContext){
if(instance==null){
instance=newMyLocalParticleAbility(applicationContext);

}
returninstance;
}

/**
*跳轉(zhuǎn)系統(tǒng)撥打電話界面
*/
publicvoiddoDial(StringdestinationNum){
...
}

publicvoiddoMessage(Stringtelephone){
....
}

}

LocalParticleAbility 需要 register 與 deregister。

publicclassMainAbilityextendsAceAbility{
@Override
publicvoidonStart(Intentintent){
super.onStart(intent);
....
MyLocalParticleAbility.getInstance(getContext()).register(this);
}

@Override
publicvoidonStop(){
super.onStop();
MyLocalParticleAbility.getInstance(getContext()).deregister(this);
}
}

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

/**
*跳轉(zhuǎn)系統(tǒng)撥打電話界面
*/
publicvoiddoDial(StringdestinationNum){
Intentintent=newIntent();
Operationoperation=newIntent.OperationBuilder()
.withAction(IntentConstants.ACTION_DIAL)//系統(tǒng)應(yīng)用撥號盤
.withUri(Uri.parse("tel:"+destinationNum))//設(shè)置號碼
.withFlags(2)
.build();
intent.setOperation(operation);
//啟動Ability
context.startAbility(intent,10);
}

//發(fā)送短信
publicvoiddoMessage(Stringtelephone){
Intentintent=newIntent();
Operationoperation=newIntent.OperationBuilder()
.withAction(IntentConstants.ACTION_SEND_SMS)
.withUri(Uri.parse("smsto:"+telephone))//設(shè)置號碼
.withFlags(Intent.FLAG_NOT_OHOS_COMPONENT)
.build();
intent.setOperation(operation);
context.startAbility(intent,11);
}

③緊急聯(lián)系人

實(shí)現(xiàn)效果:

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

js 輕量級存儲:它是 key-value 的存儲的方法,從 API Version 6 開始支持。 參考《數(shù)據(jù)管理-輕量級存儲》:

https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-apis-data-storage-0000001117163542
麻煩的是:每次存數(shù)據(jù)前,需要取一次,再新增數(shù)據(jù);在實(shí)現(xiàn)服務(wù)卡片更新信息時,需要動態(tài)的更新數(shù)據(jù)。

而 java 的輕量級存儲與 JS 存儲的不是同一目錄,目錄改成一致程序出錯,最終只能采用 js 與 java 通信,由 java 側(cè)統(tǒng)一完成數(shù)據(jù)新增與插入。

java 數(shù)據(jù)存儲實(shí)現(xiàn),java 代碼如下:

publicclassMyLocalParticleAbilityimplementsLocalParticleAbility{
privatestaticMyLocalParticleAbilityinstance;
privatestaticfinalHiLogLabelTAG=newHiLogLabel(HiLog.DEBUG,0x0,MyLocalParticleAbility.class.getName());
Preferencespreferences;
publicstaticfinalStringKEY="key_list";
ContextapplicationContext;
Contextcontext;

privateMyLocalParticleAbility(Contextcontext){
this.context=context;
this.applicationContext=context.getApplicationContext();

DatabaseHelperdatabaseHelper=newDatabaseHelper(applicationContext);
StringfileName="main_list.xml";
// fileName表示文件名,其取值不能為空,也不能包含路徑,默認(rèn)存儲目錄可以通過context.getPreferencesDir()獲取。
preferences=databaseHelper.getPreferences(fileName);
}


publicstaticMyLocalParticleAbilitygetInstance(ContextapplicationContext){
if(instance==null){
instance=newMyLocalParticleAbility(applicationContext);

}
returninstance;
}


publicStringgetContactPersonList(){
// context入?yún)㈩愋蜑閛hos.app.Context。
StringpreferencesString=preferences.getString(KEY,"");
HiLog.info(TAG,"getContactPersonListpreferencesString:"+preferencesString);
returnpreferencesString;
}


publicvoidaddContactPersonList(Stringcontent){
HiLog.info(TAG,"addContactPersonListcontent:"+content);
preferences.putString(KEY,content);
preferences.flushSync();
}
}

js 代碼:

importpromptfrom'@system.prompt';

onItemLongPress(item){
console.log(TAG+";onItemLongPress:"+item.item_name);
letTHIS=this;
//點(diǎn)擊刪除時彈出對話框
prompt.showDialog({
title:"操作提示",
message:"添加"+item.item_name+"為緊急聯(lián)系人嗎?",
buttons:[{
"text":"確定",
"color":""
},
{
"text":"取消",
"color":""
}],
success:function(data){
if(data.index==0){
THIS.addContactPersonList(item);
}
}
});
}

asyncaddContactPersonList(item){
letcontent=awaitthis.getContactPersonList();
console.info(TAG+"addContactPersonListcontent:"+content);

letlist=[]
if(content!=""){
list=JSON.parse(content);
}
list.push(item);
lettemp=JSON.stringify(list);
console.info(TAG+"addContactPersonListtemp:"+temp);

this.javaInterface.addContactPersonList(temp).then();
returntrue
//store.putSync(key,temp);
},
asyncgetContactPersonList(){
letret=awaitthis.javaInterface.getContactPersonList()
console.info(TAG+"getContactPersonListret:"+ret);
returnret
}

④js 服務(wù)卡片

實(shí)現(xiàn)效果:

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

卡片數(shù)據(jù)綁定:

publicProviderFormInfobindFormData(longformId){
HiLog.info(TAG,"bindformdata");
ZSONObjectzsonObject=newZSONObject();
StringcontactPersonList=MyLocalParticleAbility.getInstance(context.getApplicationContext()).getContactPersonList();
JSONArrayjsonArray=JSON.parseArray(contactPersonList);
for(inti=0;i

事件處理:

{
"data":{
"appName":"緊急聯(lián)系人",
"contactPersonList":"",
"titleText":"Title",
"contentText":"Introduction",
"titleText1":"",
"contentText1":"",
"actionName1":"Action1",
"actionName2":"Action2"
},
"actions":{
"routerEvent":{
"action":"router",
"abilityName":"com.pvj.addresslistdemo.MainAbility",
"params":{
"message":"weather"
}
},
"callEvent1":{
"action":"message",
"params":{
"mAction":"callEvent1"
}
},
"callEvent2":{
"action":"message",
"params":{
"mAction":"callEvent2"http://
}
}
}
}

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

@Override
publicvoidonTriggerFormEvent(longformId,Stringmessage){
HiLog.info(TAG,"handlecardclickevent."+message);

ZSONObjectzsonObject=ZSONObject.stringToZSON(message);

//Dosomethinghereafterreceivethemessagefromjscard
ZSONObjectresult=newZSONObject();
switch(zsonObject.getString("mAction")){
case"callEvent1":
call(0);
break;
case"callEvent2":
call(1);
break;
}
}

注意事項(xiàng)

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

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

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

運(yùn)行在 api 為 7 的手機(jī)的 bug,一開始莫名的#顯示。

純js 實(shí)現(xiàn)一個應(yīng)用,目前還是行不通。 js 官方文檔上,有些不是很完善和穩(wěn)定,對入門選手極其不友好。

總結(jié)

有不對或者更優(yōu)的處理技術(shù)方案請多多指教,共同學(xué)習(xí),共同進(jìn)步。

代碼地址:

https://gitee.com/guangdong-wangduoyu/addresslistdemo

原文標(biāo)題:剛出爐的鴻蒙通訊錄Demo!

文章出處:【微信公眾號:HarmonyOS技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

審核編輯:彭菁

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2967

    瀏覽量

    104746
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    3799

    瀏覽量

    64388
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    495

    瀏覽量

    22061

原文標(biāo)題:剛出爐的鴻蒙通訊錄Demo!

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    鴻蒙ArkTS的起源和簡介

    者生態(tài),語言也比較中立友好,有相應(yīng)的標(biāo)準(zhǔn)組織可以逐步演進(jìn),JS/TS語言成了比較自然的選擇。以JS/TS為基礎(chǔ),在開發(fā)框架的維度,我們做了如下的架構(gòu)演進(jìn)設(shè)計: 通過基于JS
    發(fā)表于 01-16 16:23

    HarmonyOS應(yīng)用開發(fā)-JS相關(guān)整體梳理

    :基于JS擴(kuò)展Web開發(fā)范式、基于TS擴(kuò)展的聲明
    發(fā)表于 11-29 10:44

    HarmonyOS API Version 7版本特性說明

    HDC2021上正式推出了ArkUI 3.0開發(fā)框架,在原有基于JS擴(kuò)展Web開發(fā)
    發(fā)表于 11-30 15:19

    HarmonyOS API Version 7版本特性說明

    HDC2021上正式推出了ArkUI 3.0開發(fā)框架,在原有基于JS擴(kuò)展Web開發(fā)
    發(fā)表于 12-01 10:35

    HarmonyOS-API7相對API6差異主要變更內(nèi)容

    JS UI正式命名為ArkUI,并在原有基于JS擴(kuò)展Web開發(fā)
    發(fā)表于 02-15 14:35

    OpenHarmony 應(yīng)用開發(fā)快速入門

    )。方舟開發(fā)框架可為開發(fā)者提供應(yīng)用UI開發(fā)所必須的能力,比如多種組件、布局計算、動畫能力、UI交互、繪制等等。 方舟開發(fā)框架針對不同目的和技術(shù)背景的
    發(fā)表于 05-06 16:03

    開啟OpenHarmony應(yīng)用開發(fā)之旅

    ,提升開發(fā)效率。API參考API參考提供了OpenHarmony全量組件和接口的參考文檔,可以幫助開發(fā)者快速查找到指定接口的詳細(xì)描述和調(diào)用方法。內(nèi)容包括:組件參考(基于JS擴(kuò)展
    發(fā)表于 05-12 13:49

    OpenHarmony快速入門及開發(fā)應(yīng)用所必備的基礎(chǔ)知識

    )。方舟開發(fā)框架可為開發(fā)者提供應(yīng)用UI開發(fā)所必須的能力,比如多種組件、布局計算、動畫能力、UI交互、繪制等等。方舟開發(fā)框架針對不同目的和技術(shù)背景的
    發(fā)表于 05-12 14:11

    淺析eTS的起源和演進(jìn)

    者生態(tài),語言也比較中立友好,有相應(yīng)的標(biāo)準(zhǔn)組織可以逐步演進(jìn),JS/TS語言成了比較自然的選擇。以JS/TS為基礎(chǔ),在開發(fā)框架的維度,我們做了如下的架構(gòu)演進(jìn)設(shè)計: 通過基于JS
    發(fā)表于 07-14 11:04

    開發(fā)樣例】用JS寫一個OpenHarmony拼圖小游戲

    、關(guān)鍵代碼解讀拼圖游戲代碼解讀四、參考鏈接OpenHarmony基于JS擴(kuò)展Web開發(fā)范式O
    發(fā)表于 07-29 14:25

    使用FeatureAbility模塊啟動其他Ability

    ,用于呈現(xiàn)特定信息的入口界面。JS/eTS語言是方舟開發(fā)框架(ArkUI)為開發(fā)開發(fā)應(yīng)用程序提供的兩種開發(fā)
    發(fā)表于 09-02 15:04

    HarmonyOS/OpenHarmony應(yīng)用開發(fā)-Web開發(fā)范式

    兼容JSWeb開發(fā)范式的方舟開發(fā)框架,采用經(jīng)典的HML、CSS、JavaScript三段式
    發(fā)表于 01-18 19:15

    OpenHarmony應(yīng)用開發(fā)-ArkUI方舟開發(fā)框架簡析

    ,方舟開發(fā)框架提供了兩種開發(fā)范式,分別是基于ArkTS的聲明式開發(fā)范式(簡稱“聲明式開發(fā)
    發(fā)表于 04-23 09:35

    基于ETS開發(fā)范式制作Loading組件

    最近剛接觸基于 OpenHarmony 開源框架的應(yīng)用開發(fā),特別是基于 JS/ETS 開發(fā)范式。
    的頭像 發(fā)表于 04-12 08:56 ?1414次閱讀

    鴻蒙OS元服務(wù)開發(fā)說明:【W(wǎng)ebGL網(wǎng)頁圖形庫開發(fā)接口】

    WebGL主要幫助開發(fā)者在前端開發(fā)中完成圖形圖像的相關(guān)處理,比如繪制彩色圖形等。目前該功能僅支持使用兼容JSWeb
    的頭像 發(fā)表于 04-02 17:02 ?468次閱讀
    鴻蒙OS元服務(wù)<b class='flag-5'>開發(fā)</b>說明:【W(wǎng)ebGL網(wǎng)頁圖形庫<b class='flag-5'>開發(fā)</b>接口】