Js与Android 原生交互

Js与Android 原生交互一.Android调用Js方法在html文件中编写Android所要调用的函数。test.html<html><head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"></head><body> <p id="test-p">hello!</p> <script t
摘要由CSDN通过智能技术生成

一.Android调用Js方法

在html文件中编写Android所要调用的函数。
test.html

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
</head>
<body>
    <p id="test-p">hello!</p>
    <script type="text/javascript">
        function actionFromAndroid(){
   
             document.getElementById('test-p').innerHTML += '<br/>action from android.';
        }

        function actionFromAndroidWithParam(arg){
   
             document.getElementById('test-p').innerHTML += '<br/>action from android with param:'+arg+'.';
        }

    </script>
</body>
</html>
1.使用WebView的loadUrl()函数

设置WebView的javascript可用,WebView加载页面,在UI线程里通过loadUrl()函数调用Js函数。
MainActivity.java

mWebView = (WebView) findViewById(R.id.webview);
// 启用javascript
mWebView.getSettings().setJavaScriptEnabled(true);
// 从assets目录下面的加载html
mWebView.loadUrl("file:///android_asset/test.html");
Button button = (Button) findViewById(R.id.button);
Button buttonWithParam = (Button) findViewById(R.id.buttonWithParam);
button.setOnClickListener(new Button.OnClickListener() {
   
    public void onClick(View v) {
   
	    // ui线程中运行
	    runOnUiThread(new Runnable() {
   
	        @Override
	        public void run() {
   
	            // 无参数调用
	            mWebView.loadUrl("javascript:actionFromAndroid()");
				// 传递参数调用
				mWebView.loadUrl("javascript:actionFromAndroidWithParam(" + "'这里填参数'" + ")");
	        }
	    });
    }
});
2.使用WebView的evaluateJavascript函数

设置WebView的javascript可用,WebView加载页面,在主线程里通过mWebView.evaluateJavascript()函数调用Js函数,并在onReceiveValue里处理返回值。

mWebView = (WebView) findViewById(R.id.webview);
// 启用javascript
mWebView.getSettings().setJavaScriptEnabled(true);
// 从assets目录下面的加载html
mWebView.loadUrl("file:///android_asset/test.html");
mWebView.addJavascriptInterface(this, "test");
Button button = (Button) findViewById(R.id.button);
Button buttonWithParam = (Button) findViewById(R.id.buttonWithParam);
button.setOnClickListener(new Button.OnClickListener() {
   
    public void onClick(View v) {
   
		mWebView.evaluateJavascript("javascript:actionFromAndroid(), new ValueCallback<String>() {
   
			@Override
			public void onReceiveValue(String value) {
   
			    //此处为 js 返回的结果
			    Toast.makeText(MainActivity.this, "js返回值:"+value, Toast.LENGTH_SHORT).show();
			}
		});
    }
});

对比:

方法 易用性 局限性 线程
loadUrl() 使用相对简单 返回值获取困难,效率低 刷新WebView,需在UI线程里进行
evaluateJavascript() 使用相对复杂,效率高,返回值获取容易 Android4.4以上使用 不刷新WebView,主线程中进行

两种方法各有优缺点,我们可以采用两种方式结合:当android版本低于4.4,采用loadUrl(),否则采用evaluateJavascript()。

final int version = Build.VERSION.SDK_INT;
if (version < 18) {
   

    // ui线程中运行
    runOnUiThread(new Runnable() {
   
        @Override
        public void run() {
   
            mWebView.loadUrl("javascript:actionFromAndroid()");
        }
    });

} else {
   
    mWebView.evaluateJavascript("javascript:actionFromAndroid()", new ValueCallback<String>() {
   
        @Override
        public void onReceiveValue(String va
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,为了实现在Web页面中与iOS和Android原生应用程序之间的交互,可以使用JSBridge。JSBridge是一个桥接工具,可以将JavaScript与原生应用程序之间的通信连接起来。 在iOS中,可以使用JavaScriptCore框架和WKWebView来实现JSBridge。在Android中,可以使用WebView和JavaScriptInterface来实现JSBridge。 具体来说,需要在原生应用程序中创建一个JavaScriptInterface类,该类可以实现JavaScript与原生代码之间的通信。然后在Web页面中,可以通过JavaScript调用原生应用程序中的方法。 例如,在iOS中,可以使用以下代码创建一个JavaScriptInterface类: ``` @objc class JSInterface: NSObject { weak var webView: WKWebView? init(webView: WKWebView) { self.webView = webView super.init() } @objc func showToast(_ message: String) { let alertController = UIAlertController(title: "Toast", message: message, preferredStyle: .alert) let okAction = UIAlertAction(title: "OK", style: .default, handler: nil) alertController.addAction(okAction) self.webView?.viewController?.present(alertController, animated: true, completion: nil) } } ``` 然后在Web页面中,可以通过以下代码调用原生应用程序中的showToast方法: ``` window.webkit.messageHandlers.jsInterface.postMessage({action: 'showToast', message: 'Hello world!'}); ``` 在Android中,可以使用以下代码创建一个JavaScriptInterface类: ``` public class JSInterface { private Context context; public JSInterface(Context context) { this.context = context; } @JavascriptInterface public void showToast(String message) { Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); } } ``` 然后在Web页面中,可以通过以下代码调用原生应用程序中的showToast方法: ``` window.jsInterface.showToast('Hello world!'); ``` 通过这种方式,可以实现JavaScript与iOS和Android原生应用程序之间的交互

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值