本文主要记录一些零碎的东西
最近由于项目的需要,需要使用Java代码和JS相互调用,特此记录一点入门的东西,仅仅是入门而已
github: https://github.com/CL-window/java_webview_js.git
话不多说,肯定是分为两块的
1.java 调用 js:
/**
* method here will not load html ,only load js ,just js
* will call back in {@link android.webkit.WebChromeClient#onJsAlert(
* android.webkit.WebView, java.lang.String, java.lang.String, android.webkit.JsResult)}
* 在log 里可以查看 test is ok
*/
mWebView.loadUrl("javascript:" + JS_FUNCTION);//注入js函数
// mWebView.loadUrl("javascript:" + initAssertJSToString("testJs.js"));// read from file is also ok
mWebView.loadUrl("javascript:jsFun("+"I am param"+")");//调用js函数
// mWebView.loadUrl("javascript:justTest("+TOP_SID+","+SUB_SID+")");// double param is also ok
这里使用webview , 其实没有必要加载一个html 文件,然后在html 文件里运行js,可以直接注入一段 js 代码,然后调用
本案例使用的就是这样的方式,webveiw其实没有显示任何东西
final static String JS_FUNCTION =
"function jsFun(msg) {\n" +
" alert(\"jsFun...\" + msg); " +
" }";
2.js 调用 java:
/**
* js ---调用---> java test is ok
*/
mWebView.addJavascriptInterface(new JSBridge(),"slack");
mWebView.loadUrl("file:///android_asset/index.html");// loadUrl ok
需要用到一个注解@JavascriptInterface
本地接口类
public class JSBridge {
@JavascriptInterface
public void jsMessage(String message) {
Log.i(TAG, "jsMessage" + message);
Toast.makeText(MainActivity.this,message,Toast.LENGTH_SHORT).show();
}
}
webview index
html代码里有我测试的 页面一加载就调用j s的测试代码
webview 加载网络地址记得权限
看看全部的 mainActivity,需要注意webView的回收,
import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.ConsoleMessage;
import android.webkit.JavascriptInterface;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "WebView";
private WebView mWebView;
private FrameLayout mRootView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
mRootView = (FrameLayout) findViewById(R.id.activity_main);
initWebView();
}
private String initAssertJSToString(String assetName) {
InputStream is = null;
BufferedReader br = null;
try {
is = getAssets().open(assetName);
StringBuilder sb = new StringBuilder();
String line;
br = new BufferedReader(new InputStreamReader(is));
while ((line = br.readLine()) != null) {
sb.append(line);
}
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
return "";
}finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
//
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
//
}
}
}
}
@SuppressLint("SetJavaScriptEnabled")
private void initWebView() {
/**
* 不在xml中定义 Webview ,而是在需要的时候在Activity中创建,
* 并且Context使用 getApplicationgContext()
*/
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,FrameLayout.LayoutParams.MATCH_PARENT);
mWebView = new WebView(getApplicationContext());
mWebView.setLayoutParams(params);
mRootView.addView(mWebView,0);
WebSettings setting = mWebView.getSettings();
/**
* 支持javascript脚本 会 产生 跨站脚本攻击
*/
setting.setJavaScriptEnabled(true);
/**
* 设置编码
*/
setting.setDefaultTextEncodingName("utf-8");
/**
* 设置自适应屏幕,两者合用
*/
setting.setUseWideViewPort(true); //将图片调整到适合webview的大小
setting.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
setting.setSupportZoom(true); // 支持缩放
setting.setBuiltInZoomControls(true); // 支持手势缩放
setting.setDisplayZoomControls(false); //隐藏原生的缩放控件
/**
* 缓存模式如下:
* LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
* LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
* LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。
* LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
*/
setting.setCacheMode(WebSettings.LOAD_NO_CACHE); //关闭webview中缓存
setting.setAllowFileAccess(true); //设置可以访问文件
setting.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
setting.setLoadsImagesAutomatically(true); //支持自动加载图片
setting.setDefaultTextEncodingName("utf-8");//设置编码格式
setting.setPluginState(WebSettings.PluginState.ON);
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
Log.i(TAG, "onPageStarted..." + url);
}
@Override
public void onLoadResource(WebView view, String url) {
super.onLoadResource(view, url);
// Log.i(TAG, "onLoadResource..." + url);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
// Log.i(TAG, "onPageFinished..." + url);
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
Log.i(TAG, "onReceivedError..." + error);
}
});
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
// Log.i(TAG, "onProgressChanged..." + newProgress);
}
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
// Log.i(TAG, "onReceivedTitle..." + title);
}
/**
* 设置响应js 的Alert()函数
* W/WebViewCallback: Unable to create JsDialog without an Activity
* new AlertDialog.Builder ...
*/
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Log.i(TAG, "onJsAlert..." + message);
return super.onJsAlert(view, url, message, result);
}
/**
* 设置响应js 的Confirm()函数
* new AlertDialog.Builder ...
*/
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
return super.onJsConfirm(view, url, message, result);
}
/**
* 设置响应js 的Confirm()函数
* 需要自定一个提示的布局文件
*/
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
return super.onJsPrompt(view, url, message, defaultValue, result);
}
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
// Log.i(TAG,"onConsoleMessage : " + consoleMessage.message());
return super.onConsoleMessage(consoleMessage);
}
});
}
public void startConnectWeb(View view) {
// mWebView.loadUrl("http://www.baidu.com/"); // ok
// mWebView.loadData(HTML_CODE,"text/html","uft-8"); // ok
/**
* js ---调用---> java test is ok
*/
mWebView.addJavascriptInterface(new JSBridge(),"slack");
mWebView.loadUrl("file:///android_asset/index.html");// loadUrl ok
}
/**
* java ---调用---> js need startConnectWeb first ,test is ok
*/
public void javaCallJs(View view) {
// mWebView.loadUrl("javascript:javaCallJs('java call js')");
/**
* method here will not load html ,only load js ,just js
* will call back in {@link android.webkit.WebChromeClient#onJsAlert(
* android.webkit.WebView, java.lang.String, java.lang.String, android.webkit.JsResult)}
* 在log 里可以查看 test is ok
*/
mWebView.loadUrl("javascript:" + JS_FUNCTION);//注入js函数
// mWebView.loadUrl("javascript:" + initAssertJSToString("testJs.js"));// read from file is also ok
mWebView.loadUrl("javascript:jsFun("+"I am param"+")");//调用js函数
// mWebView.loadUrl("javascript:justTest("+TOP_SID+","+SUB_SID+")");// double param is also ok
}
public class JSBridge {
@JavascriptInterface
public void jsMessage(String message) {
Log.i(TAG, "jsMessage" + message);
Toast.makeText(MainActivity.this,message,Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onResume() {
super.onResume();
/**
* 激活WebView为活跃状态,能正常执行网页的响应
*/
mWebView.onResume();
}
@Override
protected void onPause() {
super.onPause();
/**
* onPause动作通知内核暂停所有的动作,比如DOM的解析、plugin的执行、JavaScript执行
*/
mWebView.onPause();
}
@Override
protected void onDestroy() {
/**
* 先让 WebView 加载null内容,然后移除 WebView,再销毁 WebView,最后置空
*/
if (mWebView != null) {
mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
/**
* 清理cache 和历史记录
*/
mWebView.clearCache(true);
mWebView.clearHistory();
/**
* 销毁 Webview
* Webview调用destory时
* Webview仍绑定在Activity
*/
mRootView.removeView(mWebView);
mWebView.destroy();
mWebView = null;
}
super.onDestroy();
}
@Override
public void onBackPressed() {
System.exit(0);
}
final static String JS_FUNCTION =
"function jsFun(msg) {\n" +
" alert(\"jsFun...\" + msg); " +
" }";
final static String HTML_CODE =
" \n" +
" " +
" \n" +
" " +
" webview index " +
" " +
" \n" +
" " +
" "+
" \n" +
" ";
}