淺談鴻蒙應(yīng)用開發(fā)JS與Java在手機APP中的混合開發(fā)方式
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz
在進行鴻蒙應(yīng)用開發(fā)中由于每個人的開發(fā)習(xí)慣不同,鴻蒙官方文檔說明中也是支持多種開發(fā)方式,今天跟大家聊聊關(guān)于JS跟Java之間混合開發(fā)方式。
基本介紹
首先是因為我個人習(xí)慣使用JS進行頁面開發(fā)布局,但是鴻蒙提供的Java API的功能比JS API的功能要強大,所以我選擇用JS開發(fā)頁面用Java實現(xiàn)邏輯交互,那么這兩者之間如何進行通信就是我們需要考慮的問題。好在官方文檔中有關(guān)于JS API調(diào)用Java API 機制的說明,F(xiàn)A提供了三個JS接口分別為:
- FeatureAbility.callAbility(OBJECT):調(diào)用PA能力;
- FeatureAbility.subscribeAbilityEvent(OBJECT, Function):訂閱PA能力;
- FeatureAbility.unsubscribeAbilityEvent(OBJECT):取消訂閱PA能力。
在PA端也有對應(yīng)的接口其包含遠(yuǎn)端調(diào)用Ability和本地調(diào)用Internal Ability兩種方式。
PA端調(diào)用Ability接口方式為:boolean IRemoteObject.onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option);
PA端調(diào)用Internal Ability 接口方式為:boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option)
JS端與Java通過接口擴展機制進行通信,通過bundleName和abilityName進行關(guān)聯(lián),所以我們要建立兩者之間的通信,根據(jù)提供的接口字段進行相對應(yīng)匹配。
接下來通過我寫的例子方便大家更好的去理解JS是如何調(diào)用PA能力的。
權(quán)限配置
本示例需要位置權(quán)限,因此在config.json中添加以下字段,還有就是需要在手機中打開定位開關(guān)
- "reqPermissions": [ { "name": "ohos.permission.LOCATION" }],
代碼演示
JS端接口代碼如下:其中messageCode、abilityType、syncOption值根據(jù)文檔進行配置
- aa:async function (){
- var actionData = {};
- actionData.longitude = this.longitude;
- actionData.latitude = this.latitude;
- var action = {};
- action.data = actionData;
- action.bundleName = 'com.example.shundaschool';
- action.abilityName = 'com.example.shundaschool.LocationAbility';
- action.messageCode = 666;
- action.abilityType = 1;
- action.syncOption = 1;
- var result = await FeatureAbility.callAbility(action);
- var ret = JSON.parse(result);
- console.info("00000" + ret);
- console.info("0022" + JSON.stringify(ret.abilityResult));
- this.$set("address",JSON.stringify(ret.abilityResult))
- },
PA端接口代碼如下:
- ... ...
- private static final String BUNDLE_NAME = "com.example.shundaschool";
- private static final String ABILITY_NAME = "com.example.shundaschool.LocationAbility";
- ... ...
- public LocationAbility() {
- super(BUNDLE_NAME, ABILITY_NAME);
- }
- public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) {
- switch (code) {
- case location: {
- String zsonStr = data.readString();
- RequestParamsss param = ZSONObject.stringToClass(zsonStr, RequestParamsss.class);
- System.out.println("我是param經(jīng)度:"+param.getLatitude());
- System.out.println("我是param緯度:"+param.getLongitude());
- // 返回結(jié)果當(dāng)前僅支持String,對于復(fù)雜結(jié)構(gòu)可以序列化為ZSON字符串上報
- GeoConvert geoConvert = new GeoConvert();
- try{
- List<GeoAddress> address = geoConvert.getAddressFromLocation(param.getLatitude(), param.getLongitude(), 1);
- // System.out.println(address);
- // System.out.println(address.get(0).getDescriptions(0));
- Map<String, Object> zsonResult = new HashMap<String, Object>();
- zsonResult.put("code", SUCCESS);
- System.out.println("我是param:" + param);
- zsonResult.put("abilityResult", address.get(0).getDescriptions(0));
- if (option.getFlags() == MessageOption.TF_SYNC) {
- reply.writeString(ZSONObject.toZSONString(zsonResult));
- } else {
- // ASYNC
- MessageParcel reponseData = MessageParcel.obtain();
- reponseData.writeString(ZSONObject.toZSONString(zsonResult));
- IRemoteObject remoteReply = reply.readRemoteObject();
- try {
- remoteReply.sendRequest(0, reponseData, MessageParcel.obtain(), new MessageOption());
- reponseData.reclaim();
- } catch (RemoteException exception) {
- return false;
- }
- }
- }catch (IOException e){
- System.out.println("獲取位置信息異常");
- }
- break;
- }
- default:{
- reply.writeString("service not defined");
- }
- }
- return true;
- }
實現(xiàn)效果圖展示如下:
點擊獲取位置信息展示設(shè)備經(jīng)緯度,再次點擊查看位置通過逆地址轉(zhuǎn)換展示具體位置
這兩者能夠正常進行通信后,這樣我們就能夠在JS UI中進行頁面布局,在Java UI里進行邏輯處理了,希望以上內(nèi)容能對大家有所幫助。
©著作權(quán)歸作者和HarmonyOS技術(shù)社區(qū)共同所有,如需轉(zhuǎn)載,請注明出處,否則將追究法律責(zé)任。
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz