目录

 

准备工作

 两种写法


 

 Android原生方法和Web JS互相调用-两种写法_第1张图片Android原生方法和Web JS互相调用-两种写法_第2张图片

准备工作

准备一个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,见上面代码

更多相关文章

  1. android 访问网络不能在主线程中进行以及在线程中操作UI的解决方
  2. Android-Jni线程(二)— 线程锁之生产者消费者
  3. Android Studio——Android Studio更新升级方法
  4. SpannableString的使用方法
  5. Android文本输入框EditText属性和方法说明
  6. Android内部存储和外部存储的获取方法
  7. 在本地UI使用webview,在html页面用js与android通信方法。
  8. Java、Android中的回调使用 Java回调方法
  9. android设置屏幕禁止休眠的方法

随机推荐

  1. Android SD卡简单的文件读写操作
  2. 搭建 android sdk环境
  3. android 带EditView(编辑框)的AlertDialog(
  4. Java HTTP 网络请求库框架的使用
  5. android异步任务详解 AsynTask
  6. ionic实战-扫描二维码下载app,同时支持an
  7. surfaceView 与view
  8. Android 关于GridView 以及图片处理一些
  9. 使用Android studio 查看其它app的布局的
  10. Google 菜市场(Android Market)上不去的解