我的悲伤还来不及出发,就已经到站下车。——《第七天》
代码仓库:
https://github.com/Justson/AgentWeb
主要代码JsbridgeWebFragment.java
package com.just.agentweb.sample.fragment;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.widget.LinearLayout;
import com.github.lzyzsd.jsbridge.BridgeHandler;
import com.github.lzyzsd.jsbridge.BridgeWebView;
import com.github.lzyzsd.jsbridge.BridgeWebViewClient;
import com.github.lzyzsd.jsbridge.CallBackFunction;
import com.google.gson.Gson;
import com.just.agentweb.AgentWeb;
import com.just.agentweb.WebViewClient;
import androidx.annotation.Nullable;
/**
* Created by cenxiaozhong on 2017/7/1.
* source code https://github.com/Justson/AgentWeb
*/
public class JsbridgeWebFragment extends AgentWebFragment {
public static JsbridgeWebFragment getInstance(Bundle bundle) {
JsbridgeWebFragment mJsbridgeWebFragment = new JsbridgeWebFragment();
if (mJsbridgeWebFragment != null) {
mJsbridgeWebFragment.setArguments(bundle);
}
return mJsbridgeWebFragment;
}
private BridgeWebView mBridgeWebView;
@Override
public String getUrl() {
return super.getUrl();
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
mBridgeWebView = new BridgeWebView(getActivity());
mAgentWeb = AgentWeb.with(this)
.setAgentWebParent((ViewGroup) view, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT))
.useDefaultIndicator(-1, 2)
.setAgentWebWebSettings(getSettings())
.setWebChromeClient(mWebChromeClient)
.setWebViewClient(getWebViewClient())
.setWebView(mBridgeWebView)
.setSecurityType(AgentWeb.SecurityType.STRICT_CHECK)
// .setDownloadListener(mDownloadListener) 4.0.0 删除该API
.createAgentWeb()//
.ready()//
.go(getUrl());
initView(view);
mBridgeWebView.registerHandler("submitFromWeb", new BridgeHandler() {
@Override
public void handler(String data, CallBackFunction function) {
function.onCallBack("submitFromWeb exe, response data 中文 from Java");
}
});
User user = new User();
Location location = new Location();
location.address = "SDU";
user.location = location;
user.name = "Agentweb --> Jsbridge";
mBridgeWebView.callHandler("functionInJs", new Gson().toJson(user), new CallBackFunction() {
@Override
public void onCallBack(String data) {
Log.i(TAG, "data:" + data);
}
});
mBridgeWebView.send("hello");
}
private WebViewClient getWebViewClient() {
return new WebViewClient() {
BridgeWebViewClient mBridgeWebViewClient = new BridgeWebViewClient(mBridgeWebView);
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (mBridgeWebViewClient.shouldOverrideUrlLoading(view, url)) {
return true;
}
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (mBridgeWebViewClient.shouldOverrideUrlLoading(view, request.getUrl().toString())) {
return true;
}
}
return super.shouldOverrideUrlLoading(view, request);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
mBridgeWebViewClient.onPageFinished(view, url);
}
};
}
static class Location {
String address;
}
static class User {
String name;
Location location;
String testStr;
}
}
然后是com/just/agentweb/sample/activity/CommonActivity.java:140
代码:
/*JsBridge 演示*/
case FLAG_GUIDE_DICTIONARY_JSBRIDGE_SAMPLE:
ft.add(R.id.container_framelayout, mAgentWebFragment = JsbridgeWebFragment.getInstance(mBundle = new Bundle()), JsbridgeWebFragment.class.getName());
mBundle.putString(AgentWebFragment.URL_KEY, "file:///android_asset/jsbridge/demo.html");
break;
还有对应的html
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="content-type">
<title>
js调用java
</title>
</head>
<body>
<p>
<xmp id="show">
</xmp>
</p>
<p>
<xmp id="init"></xmp>
</p>
<p>
<input type="text" id="text1" value="用户名(username)" />
</p>
<p>
<input type="text" id="text2" value="password" />
</p>
<p>
<input type="button" id="enter" value="发消息给Native" onclick="testClick();"/>
</p>
<p>
<input type="button" id="enter1" value="调用Native方法" onclick="testClick1();"/>
</p>
<p>
<input type="button" id="enter2" value="显示html" onclick="testDiv();" />
</p>
<p>
<input type="file" value="打开文件" />
</p>
</body>
<script>
function testDiv() {
document.getElementById("show").innerHTML = document.getElementsByTagName("html")[0].innerHTML;
}
function testClick() {
var str1 = document.getElementById("text1").value;
var str2 = document.getElementById("text2").value;
//send message to native
var data = {id: 1, content: "这是一个图片 <img src=\"a.png\"/> test\r\nhahaha"};
window.WebViewJavascriptBridge.send(
data
, function(responseData) {
document.getElementById("show").innerHTML = "repsonseData from java, data = " + responseData
}
);
}
function testClick1() {
var str1 = document.getElementById("text1").value;
var str2 = document.getElementById("text2").value;
//call native method
window.WebViewJavascriptBridge.callHandler(
'submitFromWeb'
, {'param': '中文测试'}
, function(responseData) {
document.getElementById("show").innerHTML = "send get responseData from java, data = " + responseData
}
);
}
function bridgeLog(logContent) {
document.getElementById("show").innerHTML = logContent;
}
function connectWebViewJavascriptBridge(callback) {
if (window.WebViewJavascriptBridge) {
callback(WebViewJavascriptBridge)
} else {
document.addEventListener(
'WebViewJavascriptBridgeReady'
, function() {
callback(WebViewJavascriptBridge)
},
false
);
}
}
connectWebViewJavascriptBridge(function(bridge) {
bridge.init(function(message, responseCallback) {
console.log('Js got a message', message);
var data = {
'Javascript Responds': '测试中文!'
};
console.log('Js responding with', data);
responseCallback(data);
});
bridge.registerHandler("functionInJs", function(data, responseCallback) {
document.getElementById("show").innerHTML = ("data from Java: = " + data);
var responseData = "Javascript Says Right back aka!";
responseCallback(responseData);
});
})
</script>
</html>
效果如下: