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文件中增加广播的静态注册

<receiver
            android:name="com.xxx.xxx.ComRTKReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="rtkBroadCast" />
            </intent-filter>
        </receiver>

如果项目中能用动态注册还是用动态注册比较好,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);
        
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

博主逸尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值