Skip to content

自定义Android方法给JS调用

创建一个类,将需要提供给JS的方法用@JavascriptInterface标记

java
import android.util.Log;
import android.webkit.JavascriptInterface;

public class CustomJSBridge {
    @JavascriptInterface
    public void testJSApi(){
        Log.d("CustomJSBridge","来自js的调用");
    }
}

方式一

通过MainPageProxygetJSViewParent()获取到JSViewParent对象并调用addJavascriptInterface()

java
CustomJSBridge customJSBridge = new CustomJSBridge();
// 注意:如果没有调用 mMainPageProxy.onCreate() 拿到的JSViewParent是空的
mMainPageProxy.getJSViewParent().addJavascriptInterface(customJSBridge,"CustomJSBridge");

方式二

在Activity里注册MiniApp创建的监听,并添加自定义接口

java
CustomJSBridge mCustomJSBridge;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mMainPageProxy = new MainPageProxy(this);
    mMainPageProxy.onCreate(savedInstanceState);
    // 调用onCreate之后才能获取到JSViewParent
    mMainPageProxy.getJSViewParent().registerMiniAppLifecycleCallback(new MiniAppLifecycleCallback() {
        @Override
        public void onAppCreate(MiniApp app) {
            if (app.getAppInfo().getAppName() == "目标小程序的名") {
                // 一个进程可能会启动多个小程序, 找到目标要服务的小程序再注入, 小程序名在同一进程中是唯一的

                // 构建穿透给js的类
                if (mCustomJSBridge == null) {
                    mCustomJSBridge = new CustomJSBridge();
                }
                
                // 设置JsView对象句柄, 用于 emitEvent 这类事件通知
                // JsView接口定义见: 
                // https://jsview-dev.shijiutv.com/guide/3.dev&debug/3.7.java-api.html
                mCustomJSBridge.setJsViewHandle(app.getJsView());

                // 添加穿透接口
                app.addJavascriptInterface(customJSBridge,"CustomJSBridge");
            }
        }

        @Override
        public void onAppStart(MiniApp app) {

        }

        @Override
        public void onAppStop(MiniApp app) {

        }

        @Override
        public void onAppRelease(MiniApp app) {
            if (app.getAppInfo().getAppName() == "目标小程序的名") {
                // 清理引用避免内存泄露
                mCustomJSBridge.setJsViewHandle(null);
            }
        }
    });
}

在JS端调用接口

javascript
window.CustomJSBridge.testJSApi()

@JavascriptInterface参数支持

  • int: android端为int, js端接收后为int
  • double: android端为double, js端接收后为double
  • 字符串: android端为java.lang.String, js端接收后为String
  • buffer: android端为byte[], js端接收后为 ArrayBuffer, 后续需要js自行转成Uint8Array
  • Js函数句柄: android端为 com.qcode.jsview.JsFuncInvoker, 支持js发送一个回调函数给Java,然后Java去调用此函数
  • Promise: android端为 com.qcode.jsview.JsPromise, 支持一个js端的Promise被Java端的异步回调,