package com.baoshi.piece.base; import android.annotation.SuppressLint; import android.graphics.Bitmap; import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.util.Log; import android.view.KeyEvent; import android.webkit.CookieManager; import android.webkit.WebResourceError; import android.webkit.WebResourceRequest; import android.webkit.WebResourceResponse; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import androidx.annotation.Nullable; import com.baoshi.piece.databinding.ActivityWebViewBinding; import com.baoshi.piece.db.dao.DeliveryDao; import com.baoshi.piece.db.po.DeliveryRecord; import com.baoshi.piece.utils.JavaScriptInterface; import com.baoshi.piece.utils.MacAddressUtils; import com.yechaoa.yutils.LogUtil; import com.yechaoa.yutils.ToastUtil; import com.yechaoa.yutils.YUtils; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.List; import java.util.Map; public abstract class BaseWebViewActivity extends BaseActivity { private final Render render = new Render(); private DeliveryDao deliveryDao; private static final int REQUEST_CODE = 1001; // H5地址 protected abstract String getWebViewUrl(); // onStart回调H5 Javascript, 默认调用onRefresh() protected String getCallStartJavascript() { return "javascript:(function() {" + "onRefresh()" + "})()"; } @Override protected ActivityWebViewBinding bindView() { return ActivityWebViewBinding.inflate(getLayoutInflater()); } @Override protected Class> space() { return this.getClass(); } @Override protected void init() { render.init(); } @Override protected void onCreate(Bundle savedInstanceState) { YUtils.showLoading(this, "加载中..."); deliveryDao = new DeliveryDao(this); super.onCreate(savedInstanceState); } // 在活动由不可见变为可见的时候调用 @Override protected void onStart() { super.onStart(); // 调用H5 Javascript String jsCode = getCallStartJavascript(); if (StringUtils.isNotEmpty(jsCode)) { viewBinding.webView.evaluateJavascript(jsCode, null); } } @Override protected void onDestroy() { super.onDestroy(); if (deliveryDao != null) { deliveryDao.close(); // 在 DeliveryDao 中添加关闭方法 } viewBinding.webView.clearCache(true); // 清除缓存 viewBinding.webView.clearHistory(); // 清除历史记录 viewBinding.webView.clearFormData(); // 清除表单数据 } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { this.moveTaskToBack(true); return true; } return super.onKeyDown(keyCode, event); } /** * 获取Header */ public Map getHeaderParams() { Map params = new HashMap<>(); params.put("Source", "app"); return params; } /** * 页面渲染 */ private class Render { @SuppressLint("SetJavaScriptEnabled") private void init() { CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); cookieManager.setAcceptThirdPartyCookies(viewBinding.webView, true); WebSettings webSettings = viewBinding.webView.getSettings(); // 基础设置 webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); webSettings.setAllowFileAccess(true); // 推荐增加的现代缓存配置 webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); // 使用默认缓存策略 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { webSettings.setSafeBrowsingEnabled(true); // 启用安全浏览 } // JavaScript 接口 viewBinding.webView.addJavascriptInterface( new JavaScriptInterface(getActivity(), getHeaderParams(), viewBinding.webView, deliveryDao), "android" ); this.inject(); // 加载h5 viewBinding.webView.loadUrl(getWebViewUrl(), getHeaderParams()); } // 注入web加载点 private void inject() { viewBinding.webView.setWebViewClient(new WebViewClient() { // 开始加载页面 @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); LogUtil.d("onPageStarted: " + url); } // 完成页面加载 @Override public void onPageFinished(WebView view, String url) { LogUtil.d("onPageFinished: " + url); super.onPageFinished(view, url); YUtils.hideLoading(); } // 页面加载失败 @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { super.onReceivedError(view, request, error); LogUtil.e("WebView加载失败url: " + request.getUrl().toString()); LogUtil.e("WebView加载失败原因: " + error.getDescription()); ToastUtil.showCenter("页面加载失败!" + error.getDescription()); } // 拦截页面资源请求 @Nullable @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { LogUtil.d("请求地址= " + request.getUrl().toString()); return super.shouldInterceptRequest(view, request); } }); } } }