【Android】安卓端執行本地js文件的某個函數

最近有一個需求,就是要在安卓端獲取某個值,這個值是由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()方法就可以了
得到執行完js後的值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章