Android Webview 使用
1、Webview是什麽
- 可以加载网页
- js可与原生通讯
2、API如何用
AndroidManifest.xml 添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
xml布局文件
<WebView android:id="@+id/mWebView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
2.0、加载url的几种方式
//1. 加载一个网页
webView.loadUrl("http://www.baidu.com/");
//2. asset中的html页面
webView.loadUrl("file:///android_asset/1.html");
//3. 加载本地的html页面
webView.loadUrl("content://com.android.htmlfileprovider/sdcard/1.html");
//4. 加载HTML片段的一小段内容
WebView.loadData(String data, String mimeType, String encoding)
2.1、设置cookie
通常cookie会放置一些app的基本信息 比如:
- 包名
- 版本号
- 版本名称
- 设备类型
- 用户token
private void setCookie(String url) {
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
//value的格式为 key=value key:元数据标识,value元数据的值
cookieManager.setCookie(url, "token=123456");
if (Build.VERSION.SDK_INT < 21) {
CookieSyncManager.getInstance().sync();
} else {
CookieManager.getInstance().flush();
}
}
2.2、js与原生交互
配置
WebSettings webSettings = mWebView.getSettings();
// 设置与Js交互的权限
webSettings.setJavaScriptEnabled(true);
2.2.1、js调用android
注册一个JavascriptInterface
mWebView.addJavascriptInterface(new AndroidHandler(), "android");
AndroidHandler.java
class AndroidHandler {
@JavascriptInterface
public void test(String msg) {
System.out.println("AndroidJs:test->" + msg);
Toast.makeText(WebViewActivity.this, msg, Toast.LENGTH_SHORT).show();
}
}
在js中调用android的方法
function callAndroidByJavascriptInterface(){
android.test("js调用了android中的test方法");
}
2.2.2、android调用js
js的函数
function callJS(){
return "js返回信息:callJS";
}
android调用js方法
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
webView.evaluateJavascript("javascript:callJS()", new ValueCallback<String>(){
@Override
public void onReceiveValue(String value) {
//value 为js返回的参数信息
}
});
} else {
webView.loadUrl("javascript:callJS()");
}
2.3、常用的监听函数
WebViewClient
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
//返回true表示url已经被当前应用处理,如果为false 则会打开系统浏览器加载
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
//页面开始加载
mProgressBar.setVisibility(View.VISIBLE);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//页面加载完成
mProgressBar.setVisibility(View.GONE);
}
});
WebChromeClient
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
//页面加载进度更新
mProgressBar.setProgress(newProgress);
}
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
//网页的标题
mQToolbar.setTitle(title);
}
});
3、需要注意的几个地方
@Override
public void onBackPressed() {
//解决不能回退问题
if (mWebView.canGoBack()) {
mWebView.goBack();
return;
}
super.onBackPressed();
}
@Override
public void onPause() {
super.onPause();
//暂停
mWebView.onPause();
}
@Override
public void onResume() {
super.onResume();
//恢复
mWebView.onResume();
}
@Override
public void onDestroy() {
super.onDestroy();
//销毁
mWebView.destroy();
}