Android插件开发文档

插件开发

一个插件对应一个原生的moduleLibrary,Web插件方法名与Weex插件方法名保持一致

Weex插件开发

  • 在moduleLibrary中创建一个WeexModule继承WXModule类,写法与Weex官网一致

  • Module 扩展

  • 1、Module 扩展必须继承 WXModule 类。

  • 2、扩展方法必须加上@JSMethod (uiThread = false or true) 注解。Weex 会根据注解来判断当前方法是否要运行在 UI 线程,和当前方法是否是扩展方法。

  • 3、Weex是根据反射来进行调用Module扩展方法,所以Module中的扩展方法必须是 public 类型。

  • 4、同样因为是通过反射调用,Module不能被混淆。请在混淆文件中添加代码:-keep public class * extends com.taobao.weex.common.WXModule{*;}

  • 5、Module 扩展的方法可以使用 int, double, float, String, Map, List 类型的参数

  • 6、完成 Module 后一定要在初始化时注册 WXSDKEngine.registerModule("myModule", MyModule.class); 否则会报类似错误:ReportException :undefined:9: TypeError: Object #<Object> has no method 'printLog'

  • 示例如下:

public class MyModule extends WXModule {
  //run ui thread
  @JSMethod (uiThread = true)
  public void printLog(String msg) {
    Toast.makeText(mWXSDKInstance.getContext(),msg,Toast.LENGTH_SHORT).show();
  }
  //run JS thread
  @JSMethod (uiThread = false)
  public void fireEventSyncCall(){
   //implement your module logic here
  }
} 

Web插件开发

  • 在moduleLibrary中新建一个WebModule类,该类不继承其他类。 提供给前端调用的方法必须是public的静态方法,方法第一个形参必须是ExtendWebView。

  • 示例如下:

public class MyWebModule {

  public static void printLog(ExtendWebView webView,String msg) {
    Toast.makeText(webView.getContext(),msg,Toast.LENGTH_SHORT).show();
  }
  
  public static void fireEventSyncCall(ExtendWebView webView){
   //implement your module logic here
  }
} 

插件注册

  • 需要创建一个entry类 该类需要用@ModuleEntry注解来标注,该类注册插件代码必须写在public的init()方法内 Weex插件与官网说明注册的方式一致,Web插件注册使用WebCallBean.addClassData来注册。

  • 示例如下:

@ModuleEntry
public class MyEntry {

    /**
     * ModuleEntry
     * @param context
     */
    public void init(Context context) {
        try {
            WXSDKEngine.registerModule("myplugin", MyModule.class);
        } catch (WXException e) {
            e.printStackTrace();
        }
        WebCallBean.addClassData("myplugin", MyWebModule.class);
    }
}

插件配置

  • 插件需要被主module(app)依赖,才算将插件编译打包至apk中,建议将所有的插件module放在统一的一个目录下,在Android Studio工程的setting.gradle中配置路径即可引用module
include ':app'

include ':pmuiCitypicker'
project (":pmuiCitypicker").projectDir = new File("../Plugins/PMUI-Citypicker/android")

include ':pmuiPowerenter'
project (":pmuiPowerenter").projectDir = new File("../Plugins/PMUI-Powerenter/android")

include ':pmuiGestureLock'
project(":pmuiGestureLock").projectDir = new File("../Plugins/PMUI-GestureLock/android")

插件开发注意事项

  • Web插件注册额时的命名不支持下划线等符号,只支持大小写命名,如:umengShare
  • Web插件中不能接受onActivityResult结果,为此我们提供一个类,在需要得到结果的地方注册,注意:需要在结果回调中将这个OnH5ActivityResult实例从list中移除,示例如下 +
public static void verify(ExtendWebView webView, String userName, String groupName, JsCallback jsCallback) {
        myApp().verify(webView.getContext(), userName, groupName, pmui.MCallback(jsCallback));
        H5ActivityResultManager.getInstance().put(new OnH5ActivityResult() {
            @Override
            public void onGetResult(int requestCode, int resultCode, Intent data) {
            //注意:需要在此将这个OnH5ActivityResult实例从list中移除
                H5ActivityResultManager.getInstance().remove(this);
                myApp().onActivityResult(requestCode, resultCode, data);
            }
        });
    }