The plugin introduces new base class for Android Cordova plugins called ReflectiveCordovaPlugin
that extends CordovaPlugin
and allows to reduce boilerplate code.
This is an example of typical cordova plugin implementation:
// required imports...
public class MyPlugin extends CordovaPlugin {
private static final String METHOD_1 = "method1";
private static final String METHOD_2 = "method2";
@Override
public boolean execute(String action, CordovaArgs args, CallbackContext callbackContext) throws JSONException {
if (METHOD_1.equals(action)) {
method1(args, callbackContext);
} else if (METHOD_2.equals(action)) {
method2(callbackContext);
// more methods might go here...
} else {
return false;
}
return true;
}
protected void method1(CordovaArgs args, CallbackContext callbackContext) {
// method1 implementation goes here
}
protected void method2(CallbackContext callbackContext) {
// method2 implementation goes here
}
}
Below is equal of code using ReflectiveCordovaPlugin
:
// required imports...
import by.chemerisuk.cordova.support.ReflectiveCordovaPlugin;
public class MyPlugin extends ReflectiveCordovaPlugin {
@CordovaMethod
protected void method1(CordovaArgs args, CallbackContext callbackContext) {
// method1 implementation goes here
}
@CordovaMethod
protected void method2(CallbackContext callbackContext) {
// method2 implementation goes here
}
}
Cordova best practise is to invoke time-consuming logic in a separate thread:
// required imports...
public class MyPlugin extends CordovaPlugin {
private static final String METHOD_1 = "method1";
@Override
public boolean execute(String action, CordovaArgs args, CallbackContext callbackContext) throws JSONException {
if (METHOD_1.equals(action)) {
method1(callbackContext);
} else {
return false;
}
return true;
}
protected void method1(CallbackContext callbackContext) {
cordova.getThreadPool().execute(new Runnable {
@Override
public void run() {
// method1 implementation goes here
}
});
}
}
@CordovaMethod
annotation allows to specify execution thread as enumaration paratemer:
// required imports...
import by.chemerisuk.cordova.support.ReflectiveCordovaPlugin;
import static by.chemerisuk.cordova.support.ExecutionThread.WORKER;
public class MyPlugin extends ReflectiveCordovaPlugin {
@CordovaMethod(WORKER)
protected void method1(CallbackContext callbackContext) {
// method1 implementation goes here
}
}
Only needed for version 1.
If you obfuscate app with ProGuard then proguard-rules.pro
usually contains rules:
-keep class org.apache.cordova.* { *; }
-keep class org.apache.cordova.engine.* { *; }
-keep public class * extends org.apache.cordova.CordovaPlugin
ReflectiveCordovaPlugin
uses method names to match an appropriate action. Therefore you should keep names for methods with @CordovaMethod
annotation:
-keepclassmembers class ** {
@by.chemerisuk.cordova.support.CordovaMethod *;
}
keep public enum by.chemerisuk.cordova.support.ReflectiveCordovaPlugin$** {
**[] $VALUES;
public *;
}