1.webView常見的一些坑
- 1.Android API level 16以及之前的版本存在遠(yuǎn)程代碼執(zhí)行安全漏洞审编,該漏洞源于程序沒有正確限制使用webView.addJavascriptInterface方法,遠(yuǎn)程攻擊者可通過使用Java Refection API利用該漏洞執(zhí)行任意Java對象的方法糯而。
- 2.webView在布局文件中的使用:webView寫在其他容器中時(shí),必須先將webview從該容器中remove掉略荡,在調(diào)用webview的removeAllViews 和webview的destory方法胁赢,才能真正的銷毀整個(gè)webview,否則會出現(xiàn)內(nèi)存泄漏問題雳攘。
- 3.jsbridge :就是android端與web端之間的橋梁。實(shí)現(xiàn)兩個(gè)端互調(diào)枫笛。
- 4.webViewClient.onPageFinished:他會判斷這個(gè)網(wǎng)頁內(nèi)容是否真的已經(jīng)加載完畢吨灭。而如果當(dāng)前網(wǎng)頁產(chǎn)生跳轉(zhuǎn)的話這個(gè)方法會被加載無數(shù)次。所以我們一般使用webChromeClient.onProgressChanged崇堰。
- 5.后臺耗電 當(dāng)webview加載網(wǎng)頁時(shí) 沃于,webView會自己開啟線程涩咖,如果webview沒有很好的被銷毀的話海诲,這個(gè)線程會一直在運(yùn)行,導(dǎo)致耗電量居高不下檩互。
- 6.webView硬件加速導(dǎo)致頁面渲染問題 暫時(shí)沒有更好的解決方法特幔。只能關(guān)閉硬件加速。
- 7.webview嵌套h5支付闸昨。比如支付寶支付 微信支付的時(shí)候 需要使用webview.loadUrl(url,map)方法蚯斯。map里put一個(gè)Referer,這個(gè)Referer由H5的同事提供饵较。另外自定義WebViewClient拍嵌,重寫shouldOverrideUrlLoading()方法 具體代碼如下(請根據(jù)自己的業(yè)務(wù)需求修改):
private class MyWebViewClient extends WebViewClient {
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.e("hjj", url);
if (url.endsWith(".apk")) {
Intent browserIntent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse(url.trim());
try {
browserIntent.setData(uri);
startActivity(browserIntent);
} catch (Exception e) {
PackageManager packageManager = getPackageManager();
browserIntent.setDataAndType(uri, "text/html");
List<ResolveInfo> list = packageManager.queryIntentActivities(browserIntent, 0);
for (ResolveInfo resolveInfo : list) {
String activityName = resolveInfo.activityInfo.name;
if (activityName.contains("BrowserActivity")) {
browserIntent =
packageManager.getLaunchIntentForPackage(resolveInfo.activityInfo.packageName);
ComponentName comp =
new ComponentName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name);
browserIntent.setAction(Intent.ACTION_VIEW);
browserIntent.addCategory(Intent.CATEGORY_BROWSABLE);
browserIntent.setComponent(comp);
browserIntent.setData(uri);
}
}
startActivity(browserIntent);
}
} else {
if (url.startsWith("http") || url.startsWith("https")) {
view.loadUrl(url, headers);
} else {
try {
startActivity(new Intent("android.intent.action.VIEW", Uri.parse(url)));
} catch (Exception e) {
if (url.startsWith("alipays://") && !PlatformUtil.isInstallApp(GameActivity.this, PlatformUtil.PACKAGE_ALIPAY)) {
new AlertDialog.Builder(GameActivity.this)
.setMessage("未檢測到支付寶客戶端,請安裝后重試循诉。")
.setPositiveButton(
"立即安裝",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Uri alipayUrl = Uri.parse("https://d.alipay.com");
startActivity(new Intent("android.intent.action.VIEW", alipayUrl));
}
}).setNegativeButton("取消", null)
.show();
}
}
return true;
}
}
return false;
}
}
2.避免webview內(nèi)存泄漏方法
- 1.獨(dú)立進(jìn)程横辆,簡單暴力,不過可能涉及到進(jìn)程間通信茄猫。
WebView獨(dú)立進(jìn)程的實(shí)現(xiàn)比較簡單狈蚤,只需要在AndroidManifest中找到對應(yīng)的WebViewActivity困肩,對其配置"android: process"屬性即可。
- 2.動態(tài)添加webView脆侮,對傳入webView中使用的Context使用弱引用锌畸,動態(tài)添加WebView意思在布局創(chuàng)建個(gè)viewGroup用來放置WebView,Activity創(chuàng)建時(shí)add進(jìn)來靖避。在activity停止時(shí)remove掉潭枣。在調(diào)用webview的removeAllViews 和webview的destory方法。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者