Asynchroniczna komunikacja między Javascriptem a wtyczką Phonegap
Więc wszyscy wiedzą, że rozszerzamy klasęCordovaPlugin
i nadpisujexecute()
a następnie tworzy most między JS a natywną Javą (dla Androida). Dalej używamyPluginResult
aby zwrócić wynik z powrotem do JS.
Wszystko to dzieje się wtedy, gdy z JS wystartuje żądanie do wtyczki Java. Moje pytanie brzmi,jak wysłać wynik z powrotem do JS (a więc do HTML)asynchronicznie?
Nie wiem czy to słowoasynchroniczny jest tutaj. Chodzi o to, że chcę wysłać coś z powrotem do JS po niebiesku (powiedzmy, gdy wifi stanie się włączone / wyłączone).
Już to zbadałem, ale nie mam nic, co pasowałoby do mojej sprawy.
To, czego próbowałem, to -
StworzyłBroadcastReceiver
słuchanieWiFi
wydarzenia za pomocąWifiManager
klasa.Zarejestrowany odbiorca.I wreszcie, wyskakującToast
gdyWiFi
jest włączony / wyłączony i wysyła wynik za pomocąCallbackContext
callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, "Wifi Connected"))
i do odłączenia z inną wiadomością.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"));
}
}
}
}
TheToast
wyskakuje alePluginResult
nie jest wysyłany do JS.
PS: Słuchanie wydarzeń WiFi nie jest moim rzeczywistym problemem, chcę zreplikowaćAndroid Bluetooth Chat
aplikacja w Phonegap. Musi więc być z natury asynchroniczny.