Android原生方法和Web JS互相调用-两种写法
16lz
2021-01-23
目录
准备工作
两种写法
准备工作
准备一个html文件(htmltest.html),为了简化,直接放到项目的assets目录下调用
测试js使用
<?xml version="1.0" encoding="utf-8"?>
两种写法
注意:开放给JavaScript调用的方法必须添加@JavascriptInterface注解,在 JELLY_BEAN/API 16/4.1开始必须添加,否则JavaScript无法调用到这个接口
public class NormalHtmlActivity extends BaseActivity { WebView wv_webview; private Button btnShowInfo; private AndroidtoJs js; private Handler mHandler = new Handler(); @SuppressLint({"JavascriptInterface", "SetJavaScriptEnabled"}) @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_normal_web); wv_webview = findViewById(R.id.wv_test); btnShowInfo = (Button) findViewById(R.id.btn_showmsg); //实例化js对象 js = new AndroidtoJs(this); //设置参数 wv_webview.getSettings().setBuiltInZoomControls(true); //内容的渲染需要webviewChromClient去实现,设置webviewChromClient基类,解决js中alert不弹出的问题和其他内容渲染问题 wv_webview.setWebChromeClient(new WebChromeClient()); // 启用javascript wv_webview.getSettings().setJavaScriptEnabled(true); //第一种方式 wv_webview.addJavascriptInterface(this, "myjs"); // 第二种方式 // wv_webview.addJavascriptInterface(js, "myjs"); wv_webview.loadUrl("file:///android_asset/htmltest.html"); btnShowInfo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mHandler.post(new Runnable() { @Override public void run() { //调用 HTML 中的javaScript 函数 wv_webview.loadUrl("javascript:showMsg('原生调用JS')"); } }); } }); } //由于安全原因 需要加 @JavascriptInterface @JavascriptInterface public void showMsg(String msg) { Toast.makeText(NormalHtmlActivity.this, "JS调用HTML" + msg, Toast.LENGTH_SHORT).show(); }}
public class AndroidtoJs { private NormalHtmlActivity ma; public AndroidtoJs(NormalHtmlActivity context) { this.ma = context; } @JavascriptInterface public void showMsg(String msg) { Toast.makeText(ma, msg, Toast.LENGTH_SHORT).show(); }}
特别注意:
1.JS执行的代码不在Android的UI线程中,是在WebView Core的线程中,所以JS调用Android的接口中,需要添加到Activity.runOnUiThread中
2.JS调用Android方法,一定要一致,要么都带参数,要么都不传参数
3.Android 调用JS方法,需要在子线程中进行,比如使用Handler,见上面代码
更多相关文章
- android 访问网络不能在主线程中进行以及在线程中操作UI的解决方
- Android-Jni线程(二)— 线程锁之生产者消费者
- Android Studio——Android Studio更新升级方法
- SpannableString的使用方法
- Android文本输入框EditText属性和方法说明
- Android内部存储和外部存储的获取方法
- 在本地UI使用webview,在html页面用js与android通信方法。
- Java、Android中的回调使用 Java回调方法
- android设置屏幕禁止休眠的方法