最近有一個需求,就是要在安卓端獲取某個值,這個值是由js文件裏的某個函數生成的。問題是這個函數非常複雜,不容易將其換成Java代碼重寫,故需要安卓直接執行js代碼獲得那個值。
我在網上找了一段時間希望找到能直接運行js的Java類庫,雖然找到了rhino,但是還是沒有解決問題。所以我還是換一種思路吧,直接用WebView這個強大的東西
一、準備工作
準備一個html文檔,裏面嵌入需要運行js代碼,然後把它複製到assets目錄下。Android Studio沒有這個目錄,自己在main文件夾裏新建一個assets文件夾就行。這裏我簡單寫一個html文件
test.html
<!DOCTYPE html>
<html>
<head>
<title>test</title>
<script type="text/javascript">
function add(){
return 5+5;
}
</script>
</head>
<body>
<div>This is a test</div>
</body>
</html>
二、項目佈局
因爲我們的重點是執行js文件,所以WebView界面如何不是重點,我這裏就直接設爲不可見
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按鈕"/>
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:visibility="gone"
android:layout_height="500dp"/>
</LinearLayout>
三、Java代碼
大概代碼如下,也就是找到佈局裏的button和webview,然後初始化webview
MainActivity.java
public class MainActivity extends AppCompatActivity {
private Button btn;
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = findViewById(R.id.webView);
btn = findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
openWebView();
}
});
}
private void openWebView(){
webView.setWebViewClient(new WebViewClient(){
//一定要等頁面加載完再調用evaluateJavascript(),否則.....入坑吧
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//執行完add()函數之後執行Callback回調函數,s的值就是執行完add()之後得到的值
webView.evaluateJavascript("javascript:add()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
Log.e("11111111", "onReceiveValue: "+ s );
}
});
}
});
WebSettings webSettings = webView.getSettings();
webSettings.setDefaultTextEncodingName("UTF-8");
//webSettings.setBuiltInZoomControls(true);
//webSettings.setUseWideViewPort(true);
webSettings.setJavaScriptEnabled(true);//這個是重點,不設置則不能執行js代碼
//webSettings.setDomStorageEnabled(true);
//webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
webView.loadUrl("file:///android_asset/test.html");
}
}
上面的代碼非常簡單,其實就是重寫onPageFinished()方法(加載完網頁之後會執行),然後再調用webView.evaluateJavascript()方法就可以了