java - Javascript 和 Phonegap 插件之间的异步通信

标签 java android cordova phonegap-plugins

所以,每个人都知道我们创建了一个扩展 CordovaPlugin 的类并覆盖 execute(),然后在 JS 和 native Java(对于 Android)之间建立了一座桥梁。此外,我们使用 PluginResult 将结果返回给 JS。

所以,所有这些都发生在从 JS 向 Java 插件发出请求时。我的问题是,如何将结果发送回 JS(因此发送回 HTML)异步?

我不知道这个词是否 < strong>异步就在这里。问题是我想突然向 JS 发送一些东西(比如,当 wifi 变为启用/禁用时)。

我已经对此进行了研究,但没有任何适合我的情况。

我试过的是-

  • 使用 WifiManager 类创建了一个 BroadcastReceiver 监听 WiFi 事件。
  • 注册了接收者。
  • 最后,在 WiFi 启用/禁用时弹出 Toast,并使用 CallbackContext

    callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, "Wifi 已连接")) 和用于断开连接的其他消息。

MyPlugin.java

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.PluginResult;
import org.json.JSONArray;

...

public class MyPlugin extends CordovaPlugin {
private WifiReceiver wifiBroadcastReceiver = null;
private CallbackContext callbackContext = null;

...

    public MyPlugin() {     
        wifiBroadcastReceiver = new WifiReceiver();
    ...
    }
    ...
    public boolean execute(String action, final JSONArray args,
            final CallbackContext callbackId) throws JSONException {
        IntentFilter wifiFilter = new IntentFilter(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
        cordova.getActivity().registerReceiver(wifiBroadcastReceiver, wifiFilter);
        this.callbackContext = callbackId;

    ...
    }
    public class WifiReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();
            if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
                if (intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false)) {
                    Toast.makeText(cordova.getActivity(), "Wifi Connected", Toast.LENGTH_SHORT).show();
                    callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, "Wifi Connected"));
                } else {
                    Toast.makeText(cordova.getActivity(), "Wifi Disconnected", Toast.LENGTH_SHORT).show();
                    callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.ERROR, "Wifi Disconnected"));
                }
            }           
        }

}

Toast 弹出,但 PluginResult 没有发送到 JS。


PS : 监听 WiFi 事件不是我的实际问题,我想在 Phonegap 中复制 Android 蓝牙聊天 应用程序。因此,它本质上必须是异步的。

最佳答案

您快到了,但您需要在 PluginResult 上将KeepCallback 设置为 true。如果不这样做,Java 端的后续结果将不会在 JavaScript 端有回调。这种类型的编码最好的例子是 Cordova 核心中的网络插件。以下是来源链接:

https://git-wip-us.apache.org/repos/asf?p=cordova-plugin-network-information.git;a=blob;f=src/android/NetworkManager.java;h=e2ac500ccc885db641d5df6dab8eae23026a5828;hb=HEAD

所以你应该更新你的代码:

public boolean execute(String action, final JSONArray args,
        final CallbackContext callbackId) throws JSONException {
    IntentFilter wifiFilter = new IntentFilter(
            WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
    cordova.getActivity().registerReceiver(wifiBroadcastReceiver,
            wifiFilter);
    this.callbackContext = callbackId;
    PluginResult result = new PluginResult(PluginResult.Status.NO_RESULT);
    result.setKeepCallback(true);
    this.callbackContext.sendPluginResult(result);
    return true;
}

public class WifiReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        if (action.equals(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION)) {
            PluginResult result;
            if (intent.getBooleanExtra(
                    WifiManager.EXTRA_SUPPLICANT_CONNECTED, false)) {
                Toast.makeText(cordova.getActivity(), "Wifi Connected",
                        Toast.LENGTH_SHORT).show();
                result = new PluginResult(PluginResult.Status.OK,
                        "Wifi Connected");
            } else {
                Toast.makeText(cordova.getActivity(), "Wifi Disconnected",
                        Toast.LENGTH_SHORT).show();
                result = new PluginResult(PluginResult.Status.ERROR,
                        "Wifi Disconnected");
            }

            result.setKeepCallback(false);
            if (callbackContext != null) {
                callbackContext.sendPluginResult(result);
                callbackContext = null;
            }
        }
    }
}

关于java - Javascript 和 Phonegap 插件之间的异步通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19177991/

相关文章:

java - 从 REST API get 调用读取 InputStream

java - 多模块设置的测试覆盖率

android - 如何以编程方式更改应用程序的默认主题?

android - firebase 动态链接预览链接不适用于 facebook messenger

java - Twitter4j 在 Android 4 中崩溃

ios - PhoneGap 和 iPhone 5 : Remove top and bottom black stripes

ios - PhoneGap 检查文件是否存在

Java:定界符和正则表达式

java - 为什么 UriInfo.getQueryParameters() 不解码 '+' ?

android - 从旧的 Cordova 应用程序恢复 localStorage 数据