通讯录 demo 主要分为联系人界面、设置紧急联系人、服务卡片 3 个模块,分为 java 和 js 两个版本,本篇主要讲解用尽可能的用纯 js 去实现,实在无法实现的地方采用 js 与 java 结合。
感兴趣的小伙伴,可以自己根据原型效果自己尝试着去实现通讯录 demo 简易原型:
https://modao.cc/app/56d61f79d8390a50dbfbd4c0f17fb8a6006692f1#screen=sku2aiuwknvl3jn 通过学习与练习本 demo,可以延伸至以下场景:
功能开发
①联系人列表
实现效果:
核心代码参考《基于 js 扩展的类 web 开发范式-组件-容器组件-list》:
https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-components-container-list-0000000000611496
关键属性 indexer=“true”:
{{ $item.item_name }}
②三方跳转
实现效果:
js 和 java 通信:js 打开三方应用目前还不知道如何操作,我们通过 js 调 java 方法来实现跳转。
js localparticleability 机制请看官方链接:api 6 开始支持。
参考《js localparticleability 机制-概述》:
https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-apis-localparticleability-overview-0000001064156060
通过 js 获取到 java 接口:
export default { data: { javainterface: {} }, oninit() { console.log(tag + ;oninit())); }, onshow() { console.log(tag + ;onshow())); // oninit生命周期中java接口对象还未创建完成,请勿在oninit中调用。 this.javainterface = createlocalparticleability('com.pvj.addresslistdemo.mylocalparticleability'); } onclickphone() { this.javainterface.dodial(this.item_phone) }, onclickmail() { this.javainterface.domessage(this.item_phone) }}
java 实现:
public class mylocalparticleability implements localparticleability { private static mylocalparticleability instance; context applicationcontext; context context; private mylocalparticleability(context context) { this.context = context; this.applicationcontext = context.getapplicationcontext(); } public static mylocalparticleability getinstance(context applicationcontext) { if (instance == null) { instance = new mylocalparticleability(applicationcontext); } return instance; } /** * 跳转系统拨打电话界面 */ public void dodial(string destinationnum) { ... } public void domessage(string telephone) { .... }}
localparticleability 需要 register 与 deregister。
public class mainability extends aceability { @override public void onstart(intent intent) { super.onstart(intent); .... mylocalparticleability.getinstance(getcontext()).register(this); } @override public void onstop() { super.onstop(); mylocalparticleability.getinstance(getcontext()).deregister(this); } }
拨打电话与发送短信:
/** * 跳转系统拨打电话界面 */public void dodial(string destinationnum) { intent intent = new intent(); operation operation = new intent.operationbuilder() .withaction(intentconstants.action_dial) // 系统应用拨号盘 .withuri(uri.parse(tel: + destinationnum)) // 设置号码 .withflags(2) .build(); intent.setoperation(operation); // 启动ability context.startability(intent, 10);}//发送短信public void domessage(string telephone) { intent intent = new intent(); operation operation = new intent.operationbuilder() .withaction(intentconstants.action_send_sms) .withuri(uri.parse(smsto: + telephone)) // 设置号码 .withflags(intent.flag_not_ohos_component) .build(); intent.setoperation(operation); context.startability(intent, 11);}
③紧急联系人
实现效果:
js 数据存储:优先用关系型数据库,发现 js 从 api version 7 开始支持。
js 轻量级存储:它是 key-value 的存储的方法,从 api version 6 开始支持。 参考《数据管理-轻量级存储》:
https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-apis-data-storage-0000001117163542 麻烦的是:每次存数据前,需要取一次,再新增数据;在实现服务卡片更新信息时,需要动态的更新数据。
而 java 的轻量级存储与 js 存储的不是同一目录,目录改成一致程序出错,最终只能采用 js 与 java 通信,由 java 侧统一完成数据新增与插入。
java 数据存储实现,java 代码如下:
public class mylocalparticleability implements localparticleability { private static mylocalparticleability instance; private static final hiloglabel tag = new hiloglabel(hilog.debug, 0x0, mylocalparticleability.class.getname()); preferences preferences; public static final string key = key_list; context applicationcontext; context context; private mylocalparticleability(context context) { this.context = context; this.applicationcontext = context.getapplicationcontext(); databasehelper databasehelper = new databasehelper(applicationcontext); string filename = main_list.xml; // filename表示文件名,其取值不能为空,也不能包含路径,默认存储目录可以通过context.getpreferencesdir()获取。 preferences = databasehelper.getpreferences(filename); } public static mylocalparticleability getinstance(context applicationcontext) { if (instance == null) { instance = new mylocalparticleability(applicationcontext); } return instance; } public string getcontactpersonlist() { // context入参类型为ohos.app.context。 string preferencesstring = preferences.getstring(key, ); hilog.info(tag, getcontactpersonlist preferencesstring : + preferencesstring); return preferencesstring; } public void addcontactpersonlist(string content) { hilog.info(tag, addcontactpersonlist content : + content); preferences.putstring(key, content); preferences.flushsync(); }}
js 代码:
import prompt from '@system.prompt'; onitemlongpress(item) { console.log(tag + ;onitemlongpress: + item.item_name); let this = this; //点击删除时弹出对话框 prompt.showdialog({ title: 操作提示, message: 添加 + item.item_name + 为紧急联系人吗?, buttons: [{ text: 确定, color: }, { text: 取消, color: }], success: function (data) { if (data.index == 0) { this.addcontactpersonlist(item); } } }); } async addcontactpersonlist(item) { let content = await this.getcontactpersonlist(); console.info(tag + addcontactpersonlist content: + content); let list = [] if(content != ){ list = json.parse(content); } list.push(item); let temp = json.stringify(list); console.info(tag + addcontactpersonlist temp: + temp); this.javainterface.addcontactpersonlist(temp).then(); return true // store.putsync(key, temp); }, async getcontactpersonlist() { let ret = await this.javainterface.getcontactpersonlist() console.info(tag + getcontactpersonlist ret: + ret); return ret }
④js 服务卡片
实现效果:
创建卡片模板:
卡片数据绑定:
public providerforminfo bindformdata(long formid) { hilog.info(tag, bind form data); zsonobject zsonobject = new zsonobject(); string contactpersonlist = mylocalparticleability.getinstance(context.getapplicationcontext()).getcontactpersonlist(); jsonarray jsonarray = json.parsearray(contactpersonlist); for (int i = 0; i < jsonarray.size(); i++) { string name = jsonarray.getjsonobject(i).getstring(item_name); string phone = jsonarray.getjsonobject(i).getstring(item_phone); if (i == 0) { zsonobject.put(titletext, name); zsonobject.put(contenttext, phone); } else if (i == 1) { zsonobject.put(titletext1, name); zsonobject.put(contenttext1, phone); //传递的是string;是否支持其他类型?比如数组 } else { break; } hilog.info(tag, bind form data : + jsonarray.getjsonobject(i).get(item_name)); hilog.info(tag, bind form data : + jsonarray.getjsonobject(i).get(item_phone)); } providerforminfo providerforminfo = new providerforminfo(); providerforminfo.setjsbindingdata(new formbindingdata(zsonobject)); return providerforminfo;}
事件处理:
{ data: { appname: 紧急联系人, contactpersonlist: , titletext: title, contenttext: introduction, titletext1: , contenttext1: , actionname1: action 1, actionname2: action 2 }, actions: { routerevent: { action: router, abilityname: com.pvj.addresslistdemo.mainability, params: { message: weather } }, callevent1: { action: message, params: { maction: callevent1 } }, callevent2: { action: message, params: { maction: callevent2 // } } }}
call 就是前面的播打电话的方法:
@overridepublic void ontriggerformevent(long formid, string message) { hilog.info(tag, handle card click event. + message); zsonobject zsonobject = zsonobject.stringtozson(message); // do something here after receive the message from js card zsonobject result = new zsonobject(); switch (zsonobject.getstring(maction)) { case callevent1: call(0); break; case callevent2: call(1); break; }}
注意事项
demo 还有很多需要完善的地方。
①删除时,索引不会被删除。
②索引想要自定义样式,目前实现不了。
③运行在 api 为 7 的手机的 bug,一开始莫名的#显示。
④纯 js 实现一个应用,目前还是行不通。 ⑤js 官方文档上,有些不是很完善和稳定,对入门选手极其不友好。
总结
有不对或者更优的处理技术方案请多多指教,共同学习,共同进步。
代码地址:
https://gitee.com/guangdong-wangduoyu/addresslistdemo
原文标题:刚出炉的鸿蒙通讯录demo!
文章出处:【微信公众号:harmonyos技术社区】欢迎添加关注!文章转载请注明出处。
小米MIX2最新消息汇总:小米MIX2高颜值高配置价格破4K?小米MIUI9加持
德州仪器最新数据采集系统可大幅降低功耗、空间和成本
中电港:拟不低于3560万元转让子公司艾矽易100%股权
雷军透露小米9快充一定会更好
从技术体系结构上说,物联网包括着六大方面
基于JS扩展的类Web开发范式
爱立信与巴林Zain双方达成了5G商用协议
疫情促使制造业转型,TCL华星借助智能制造系统提高极致效率和竞争力
基于TinyOS操作系统实现无线传感器节点Mica的设计
客运索道相对落后,缺乏相应的标准规范及科学的技术手段
手套不泄漏性能测定仪的主要用途及技术指标
微星MPG27CQ显示器评测 性能称得上是一款优秀的显示器
特斯拉第三季度将增加新车交付量 ModelS和ModleX将实现小改造
人工智能、大数据和云计算相辅相成,“云”已逐渐成为企业、政务平台首选
开放原子开源基金会理事长杨涛荣膺“TVP腾讯云最具价值专家”奖
从晶体管电路方面来理解放大原理!对晶体管饱和、饱和压降的理解
电容器容量的三种标示方法的详细说明
Redmi K30全球首发索尼IMX686 小米对高像素格外执着
MATLAB在数据方面的应用分析解读
暖气温度报警系统的简单制作