Cordova插件开发三:通过广播实现应用间跨进程通信

文章目录

  • 1.最终效果预览
  • 2.数据发送
  • 3.插件接受数据
  • 4.JS页面中点击获取数据返回

1.最终效果预览

Cordova插件开发三:通过广播实现应用间跨进程通信_第1张图片

场景说明:我们给自来水公司开发了一个h5应用,需要对接第三方厂家支持硬件设备以便于获取到高精度定位数据,之前几篇文件写过,我已经集成过南方测绘RTK和高精度定位模块的设备,厂商自己基本都有工具应用连接卫星并解析数据,这样我们就利用这点,让厂商讲获取的数据通过广播定时发送出来,在我们的h5应用中接受广播并获取数据即可,这样我们只需要开发一个通用的插件即可实现。

2.数据发送

        timer = new Timer();
        btn = (Button)findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        sendData();
                    }
                }, 1000, 1000);
            }
        });

        stop = (Button)findViewById(R.id.stop);
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                count = 0;
                stopTimer();
            }
        });
        
        
           public void sendData(){
            ++count;
            Intent intent = new Intent(ACTION_CUSTOM_BROADCAST);
            intent.putExtra("Latitude",lat.getText().toString());
            intent.putExtra("Longitude",lon.getText().toString());
            intent.putExtra("Altitude",alt.getText().toString());
            intent.putExtra("state","单点解"+count);
            intent.setPackage("com.xxx.xxxx");
            sendBroadcast(intent);

    }


    private void stopTimer(){
        if(timer != null){
            timer = null;
        }
    }

Demo中定义两个按钮一个发送一个停止发送,加个定时器不停发送便于模拟真实情况。

3.插件接受数据

基于插件二的功能做的测试,简单的改了下即可获取。

public class ComRTKReceiver extends BroadcastReceiver {
    public static final String ACTION_CUSTOM_BROADCAST = "rtkBroadCast";
    double latitude,longitude,altitude;
    Context mContext;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(ACTION_CUSTOM_BROADCAST)) {
            String lat = intent.getStringExtra("Latitude");
            latitude = Double.parseDouble(lat);
            RTKlocationManager.rtkLat = latitude;
            String lon = intent.getStringExtra("Longitude");
            longitude = Double.parseDouble(lon);
            RTKlocationManager.rtkLon = longitude;
            String alt = intent.getStringExtra("Altitude");
            altitude = Double.parseDouble(alt);
            RTKlocationManager.rtkAlt = altitude;
            String str = intent.getStringExtra("state");
            RTKlocationManager.rtkGpsState = str;
        }

    }
}

ComRTKReceiver 路径为com.xxx.xxx,根据这个路径在xml文件中增加广播的静态注册


            
                
            
        

如果项目中能用动态注册还是用动态注册比较好,Android8.0之后对静态注册非系统广播有了更严格的限制,发送广播的时候需要传递接受广播的包名才能在固定的应用中收到 intent.setPackage(“com.xxx.xxxx”),我的项目插件是cordova插件,在插件中没法动态注册广播,即使在原生的壳中注册成功了,获取到数据之后也不方便传递到页面中,动态广播注册可以用如下方式

registerGpsDataReceiver();
private void registerGpsDataReceiver() {
        if (mGpsDataBroadcastReceiver != null) {
            unregisterGpsDataReceiver();
        }
        mGpsDataBroadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (intent.getAction().equals(ACTION_CUSTOM_BROADCAST)) {
                    String lat = intent.getStringExtra("Latitude");
                    String lon = intent.getStringExtra("Longitude");
                    String alt = intent.getStringExtra("Altitude");
                    String str = intent.getStringExtra("state");
                }


            }
        };
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(ACTION_CUSTOM_BROADCAST);
        registerReceiver(mGpsDataBroadcastReceiver, intentFilter);
    }

    private void unregisterGpsDataReceiver() {
        if (mGpsDataBroadcastReceiver != null) {
            unregisterReceiver(mGpsDataBroadcastReceiver);
            mGpsDataBroadcastReceiver = null;
        }
    }

4.JS页面中点击获取数据返回

    let res = await this.utilTools.settingRTKLocation(this.obj)
    console.log("res:" + JSON.stringify(res))

模拟的按钮点击数据为{ id: 6, name: ‘广播测试’, value: ‘broadcastTest’, img: ‘’ }

插件关键代码入口

if("settingRTKLocation".equals(action)){
            message = args.getJSONObject(0);
            delayTime = message.getInt("delayTime");
            intervalTime = message.getInt("intervalTime");
            isKeepCallBack = message.getBoolean("isKeepCallBack")||false;
            paramKey =  message.getString("paramKey");
            this.goPageByParam(callbackContext,paramKey);
            return true;
        }

goPageByParam中根据key不同执行不同的获取数据方法

 private void goPageByParam(CallbackContext callbackContext, String key){
        singleLocaitonCC = callbackContext;
        switch (key) {
            case "broadcastTest":
                try {
                    getBroadCastData();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                break;
        }

    }

getBroadCastData中返回坐标等参数

private void getBroadCastData() throws JSONException {
        JSONObject json = new JSONObject();
        json.put("latitude",rtkLat);
        json.put("longitude",rtkLon);
        json.put("altitude",rtkAlt);
        json.put("hrms",hrms);
        json.put("vrms",vrms);
        json.put("rms",rms);
        json.put("type","rtkGps");
        json.put("gpsStatue",gpsStatue);
        json.put("gpsStatueStr",rtkGpsState);
        json.put("code", "200");
        PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, json);
        singleLocaitonCC.sendPluginResult(pluginResult);
        
    }

你可能感兴趣的:(Cordova插件开发实战,java,服务器,网络)