Android JS 回调详解
在Android开发中,我们经常需要与前端进行交互,特别是在Webview中嵌入页面时。其中,前端通过JavaScript调用Android的方法,而Android则需要通过回调的方式将结果传递给前端。
本文将详细介绍Android中使用JS回调的过程,包括如何注册回调方法、如何在JavaScript中调用Android方法以及如何将结果传递给前端。
1. 注册回调方法
首先,在Android中需要注册一个回调方法,以便JavaScript能够调用。我们可以使用addJavascriptInterface
方法将一个Java对象注入到WebView中,然后在该Java对象中定义回调方法。
// 1. 创建一个Java对象,用于回调
public class JavaScriptInterface {
private MyCallbackListener listener;
public void setCallbackListener(MyCallbackListener listener) {
this.listener = listener;
}
// 2. 定义回调方法
@JavascriptInterface
public void callback(String data) {
if (listener != null) {
listener.onCallback(data);
}
}
// 3. 定义回调接口
public interface MyCallbackListener {
void onCallback(String data);
}
}
// 4. 在Activity中注册回调对象
webView.addJavascriptInterface(new JavaScriptInterface(), "Android");
上述代码中,我们创建了一个JavaScriptInterface
类,其中定义了一个回调方法callback
和一个回调接口MyCallbackListener
。在Activity中,我们将该对象通过addJavascriptInterface
方法注入到WebView中,并指定了一个名称"Android",以便在JavaScript中调用。
2. 在JavaScript中调用Android方法
一旦我们将Java对象注入到WebView中,JavaScript就可以使用window.Android
来调用Android方法了。下面是一个例子,通过JavaScript调用Android的callNative
方法,并传递一个参数。
// 1. 在JavaScript中调用Android方法
window.Android.callNative("Hello, Android!");
那么,在Android中我们应该如何接收这个调用,并执行相应的操作呢?这就需要用到@JavascriptInterface
注解和我们之前注册的回调方法了。
// 2. 在Java中接收JavaScript的调用
@JavascriptInterface
public void callNative(String message) {
// 处理传递过来的参数
Log.d(TAG, "Received message from JavaScript: " + message);
// 执行相应的操作
// 3. 调用回调方法将结果传递给前端
if (callbackListener != null) {
callbackListener.callback("Hello, JavaScript!");
}
}
上述代码中,我们使用@JavascriptInterface
注解标注了callNative
方法,以便JavaScript能够调用。在该方法中,我们可以处理传递过来的参数,并执行相应的操作。最后,我们调用回调方法callback
,将结果传递给前端。
3. 将结果传递给前端
在回调方法中,我们可以通过之前定义的回调接口MyCallbackListener
将结果传递给前端。下面是一个例子,展示了在回调方法中触发回调接口,并将结果传递给前端。
public class JavaScriptInterface {
private MyCallbackListener listener;
public void setCallbackListener(MyCallbackListener listener) {
this.listener = listener;
}
@JavascriptInterface
public void callback(String data) {
if (listener != null) {
listener.onCallback(data);
}
}
public interface MyCallbackListener {
void onCallback(String data);
}
}
在该例子中,我们通过调用listener.onCallback(data)
触发回调接口,并将结果data
传递给前端。
序列图
下面是一个基于mermaid语法的序列图,展示了Android JS回调的整个过程。
sequenceDiagram
participant Android
participant JavaScript
participant WebView
activate Android
activate JavaScript
activate WebView
Android->>WebView: addJavascriptInterface
activate JavaScriptInterface
loop 监听回调
JavaScript->>Android: callNative
Android->>JavaScriptInterface: callNative
JavaScriptInterface->>JavaScript: callback
end
JavaScriptInterface->>Android: callback
Android->>JavaScript: MyCallbackListener.onCallback
JavaScript->>WebView: 接收回调结果
deactivate Android
deactivate JavaScript
deactivate WebView