最近项目中需要用到android和js的交互
重点:必须和前端共同进行调试、参数定义一致(还有缓存特别严重,注意清除缓存)
1、初始化(看需求而定)
WebView wView = findViewById(R.id.web_view);
WebSettings webSettings = wView.getSettings();
//允许js弹窗
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setJavaScriptEnabled(true);
webSettings.setBuiltInZoomControls(true);
webSettings.setAllowFileAccess(true);
webSettings.setDefaultTextEncodingName("utf-8");
wView.setWebContentsDebuggingEnabled(true);
wView.getSettings().setTextZoom(100);
2、js调用android
//JavaScriptinterface类名 iceAndroid变量名必须和js一致,注意缓存
wView.addJavascriptInterface(new JavaScriptinterface(), "iceAndroid");//这个方法要放在加载loadUrl之前调用
public class JavaScriptinterface {
/**
* 与js交互时用到的方法,在js里直接调用的
*/
@JavascriptInterface
public void showToast(String s) {
Toast.makeText(TicketWVActivity.this, s, Toast.LENGTH_LONG).show();
}
}
3、android向js传值
wView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
wView.post(new Runnable() {
@Override
public void run() {
//javascript这个是固定的,getFromAndroid()可以传无参也可以有参,注意'""'的拼接,必须js的方法一致
//signData(venueId)这个是我这边转的json的方法,
wView.loadUrl("javascript:getFromAndroid('" + signData(venueId) + "')");
}
});
}
});
判断webview的返回上一级
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && wView.canGoBack()) {
wView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
android 在js界面弹窗:
//必须要开子线程,然后主线程进行更新 TicketWVActivity.this.runOnUiThread(new Runnable() { @Override public void run() { if (jsCommentOrderBean.getTelephone() != null) { //popwindow telephone是js传递过来的手机号,我这边弹窗拨打电话 showPhonePopwindow(jsCommentOrderBean.getTelephone()); } } });
清除缓存
@Override
protected void onDestroy() {
super.onDestroy();
//清空所有Cookie
CookieSyncManager.createInstance(App.getAppContext());
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
CookieSyncManager.getInstance().sync();
if (wView != null) {
wView.setWebChromeClient(null);
wView.setWebViewClient(null);
wView.getSettings().setJavaScriptEnabled(false);
wView.clearCache(true);
}
}
省时、省力、可以直接用