淺談鴻蒙應用開發(fā)JS與Java在手機APP中的混合開發(fā)方式
https://harmonyos.51cto.com/#zz
在進行鴻蒙應用開發(fā)中由于每個人的開發(fā)習慣不同,鴻蒙官方文檔說明中也是支持多種開發(fā)方式,今天跟大家聊聊關于JS跟Java之間混合開發(fā)方式。
基本介紹
首先是因為我個人習慣使用JS進行頁面開發(fā)布局,但是鴻蒙提供的Java API的功能比JS API的功能要強大,所以我選擇用JS開發(fā)頁面用Java實現(xiàn)邏輯交互,那么這兩者之間如何進行通信就是我們需要考慮的問題。好在官方文檔中有關于JS API調用Java API 機制的說明,F(xiàn)A提供了三個JS接口分別為:
- FeatureAbility.callAbility(OBJECT):調用PA能力;
- FeatureAbility.subscribeAbilityEvent(OBJECT, Function):訂閱PA能力;
- FeatureAbility.unsubscribeAbilityEvent(OBJECT):取消訂閱PA能力。
在PA端也有對應的接口其包含遠端調用Ability和本地調用Internal Ability兩種方式。
PA端調用Ability接口方式為:boolean IRemoteObject.onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option);
PA端調用Internal Ability 接口方式為:boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option)
JS端與Java通過接口擴展機制進行通信,通過bundleName和abilityName進行關聯(lián),所以我們要建立兩者之間的通信,根據(jù)提供的接口字段進行相對應匹配。
接下來通過我寫的例子方便大家更好的去理解JS是如何調用PA能力的。
權限配置
本示例需要位置權限,因此在config.json中添加以下字段,還有就是需要在手機中打開定位開關
- "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());
- // 返回結果當前僅支持String,對于復雜結構可以序列化為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)效果圖展示如下:
點擊獲取位置信息展示設備經(jīng)緯度,再次點擊查看位置通過逆地址轉換展示具體位置
這兩者能夠正常進行通信后,這樣我們就能夠在JS UI中進行頁面布局,在Java UI里進行邏輯處理了,希望以上內(nèi)容能對大家有所幫助。
©著作權歸作者和HarmonyOS技術社區(qū)共同所有,如需轉載,請注明出處,否則將追究法律責任。
https://harmonyos.51cto.com/#zz