相信大家看完代码就会明白:

MainActivity.java

package com.example.testjs;import android.annotation.SuppressLint;import android.app.Activity;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Handler;import android.webkit.JavascriptInterface;import android.webkit.WebChromeClient;import android.webkit.WebSettings;import android.webkit.WebSettings.RenderPriority;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.Toast;import com.example.testjs.utils.Constant;/** * 实现Android本地Java与JS的互调 * 1.Android调用JS: * mWebView.loadUrl("javascript:" + "function()"); *  * 2.JS调用Android: * a.设置WebView支持JS:mWebView.getSettings().setJavaScriptEnabled(true); * b.创建一个JS调用代理类:class JavascriptInterfaceProxy * 1).Android 4.2 以后需要将代理类中的方法注解:@JavascriptInterface * c.mWebView.addJavascriptInterface(new JavascriptInterfaceProxy(), "MyJsInterface"); *  * @author Yanbao_Wu * */public class MainActivity extends Activity {public static final String TAG = MainActivity.class.getSimpleName();public static final int SAY_HELLO = 0;public static final int SAY_BYEBYE = 1;private WebView mWebView = null;@SuppressLint("HandlerLeak") public Handler mHandler = new Handler(){public void handleMessage(android.os.Message msg) {switch (msg.what) {case SAY_HELLO:Toast.makeText(MainActivity.this, "just say hello from JS", Toast.LENGTH_SHORT).show();break;case SAY_BYEBYE:Toast.makeText(MainActivity.this, "Bye-bye called from JS", Toast.LENGTH_SHORT).show();default:break;}};};    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                findId();        initWebView(mWebView);    }        /**     * @author Yanbao_Wu     */    public void findId(){    mWebView = (WebView) findViewById(R.id.webview_contend);    }        /**     * Init the web settings.     *      * @author Yanbao_Wu     */    @SuppressLint("SetJavaScriptEnabled")     public void initWebView(WebView mWebView){    mWebView.getSettings().setJavaScriptEnabled(true);mWebView.getSettings().setRenderPriority(RenderPriority.HIGH);mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);// 设置可以使用localStoragemWebView.getSettings().setDomStorageEnabled(true);// 应用可以有数据库mWebView.getSettings().setDatabaseEnabled(true);String cacheDirPath = getFilesDir().getAbsolutePath() + Constant.APP_H5_CACHE_DIRNAME;// 设置 H5缓存目录mWebView.getSettings().setAppCachePath(cacheDirPath);// 应用可以有缓存mWebView.getSettings().setAppCacheEnabled(true);/** *  注意: * 由于4.4之前使用的是WebKit内核,而4.4使用的是chromium内核, * 所以WebViewClient中的方法调用的次数和顺序会不一样,如果按照正常的逻辑处理, *  可能会出现一些问题,这里可以做些版本兼容性判断。 */mWebView.setWebViewClient(new WebViewClient(){@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {// 自定义加载过程中的动画,例如一个loading的界面super.onPageStarted(view, url, favicon);}@Overridepublic void onPageFinished(WebView view, String url) {// TODO Auto-generated method stubsuper.onPageFinished(view, url);}@Overridepublic void onReceivedError(WebView view, int errorCode,String description, String failingUrl) {// 可以自定义错误页面覆盖WebViewsuper.onReceivedError(view, errorCode, description, failingUrl);}});mWebView.setWebChromeClient(new WebChromeClient(){@Overridepublic void onReceivedTitle(WebView view, String title) {/* * 可以获取Web页面的Title来设置移动端的Title, * 但是在部分手机上,调用goBack()方法时,不会触发onReceivedTitle()方法所以onTitle没有变化, * 所以需要做简单的处理: * 1.已知WebView最多只有二级页面,不存在更深层次的页面时,可以在调用goBack的时候,直接将Title设置回去就可以了 * 2.当WebView的页面层次不确定时,可能会有很深层次的页面,这时需要我们手动的去维护对应页面的Title的一个栈了,我们可以 * 使用HashMap去维护这样的(url,title)的栈,当进去新的页面时直接加到Map中即可,当回退是进行退栈操作就可以了 * 当WebView加载出错时,Title会显示"找不到该网页",所以需要我们在onReceivedError方法中自行更改Title */super.onReceivedTitle(view, title);}});/* * 第一个参数代理类的对象,第二个参数供JS调用方法的对象名称 * JS调用的方式大致可以通过: * MyJsInterface.testJS(); * MyJsInterface.testLowVerssion(); // Android 4.2以后不能调用 */mWebView.addJavascriptInterface(new JavascriptInterfaceProxy(), "MyJsInterface");mWebView.loadUrl("file:///android_asset/js.html");    }        /**     * The proxy class which used by JS.     *      * @author Yanbao_Wu     */    public class JavascriptInterfaceProxy{        @JavascriptInterface    public void testJS(){    mHandler.sendEmptyMessage(SAY_HELLO);    mWebView.loadUrl("javascript:wave()");    }        // 4.2以后不能被JS调用    public void testLowVerssion(){    mHandler.sendEmptyMessage(SAY_BYEBYE);    }    }        @Override    protected void onDestroy() {//如果WebView中加载音频后退出Activity音频声音无法消失,可通过以下方法解决//    rootLayout.removeView(webView);  //    webView.destroy();    super.onDestroy();    }}
下面是一个HTML的代码,放在项目的assets目录下:

                                                            
Click me!



更多相关文章

  1. android 浏览器怎么支持 window.close() 和window.opener.locati
  2. Android修改自己程序字体的方法详解
  3. Android中如何解决输入法键盘和activity页面遮挡的问题
  4. android使用android:ellipsize="end"无效的解决方法
  5. Android 软件安装方法介绍
  6. Android实现全屏显示的方法
  7. Android实际分辨率(android:anyDensity="false"的情况下的获取方

随机推荐

  1. TensorFlow layers模块用法
  2. Mybatis if, set, where 动态sql和sql片
  3. 99%的人都不知道的pandas骚操作(一)
  4. TensorFlow RNN Cell源码解析
  5. Requests库作者Kenneth Reitz的另一神作!
  6. TensorFlow Bi-LSTM实现文本分词
  7. JavaScript加密逻辑分析与Python模拟执行
  8. 关于互联网金融授信产品的风控建模
  9. 使用requests+正则表达式爬取猫眼电影排
  10. Learning to Rank概述