BaseWebViewActivity.java 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package com.baoshi.piece.base;
  2. import android.annotation.SuppressLint;
  3. import android.graphics.Bitmap;
  4. import android.os.Build;
  5. import android.os.Bundle;
  6. import android.provider.Settings;
  7. import android.util.Log;
  8. import android.view.KeyEvent;
  9. import android.webkit.CookieManager;
  10. import android.webkit.WebResourceError;
  11. import android.webkit.WebResourceRequest;
  12. import android.webkit.WebResourceResponse;
  13. import android.webkit.WebSettings;
  14. import android.webkit.WebView;
  15. import android.webkit.WebViewClient;
  16. import androidx.annotation.Nullable;
  17. import com.baoshi.piece.databinding.ActivityWebViewBinding;
  18. import com.baoshi.piece.db.dao.DeliveryDao;
  19. import com.baoshi.piece.db.po.DeliveryRecord;
  20. import com.baoshi.piece.utils.JavaScriptInterface;
  21. import com.baoshi.piece.utils.MacAddressUtils;
  22. import com.yechaoa.yutils.LogUtil;
  23. import com.yechaoa.yutils.ToastUtil;
  24. import com.yechaoa.yutils.YUtils;
  25. import org.apache.commons.lang3.StringUtils;
  26. import java.util.HashMap;
  27. import java.util.List;
  28. import java.util.Map;
  29. public abstract class BaseWebViewActivity extends BaseActivity<ActivityWebViewBinding> {
  30. private final Render render = new Render();
  31. private DeliveryDao deliveryDao;
  32. private static final int REQUEST_CODE = 1001;
  33. // H5地址
  34. protected abstract String getWebViewUrl();
  35. // onStart回调H5 Javascript, 默认调用onRefresh()
  36. protected String getCallStartJavascript() {
  37. return "javascript:(function() {" +
  38. "onRefresh()" +
  39. "})()";
  40. }
  41. @Override
  42. protected ActivityWebViewBinding bindView() {
  43. return ActivityWebViewBinding.inflate(getLayoutInflater());
  44. }
  45. @Override
  46. protected Class<? extends BaseActivity<ActivityWebViewBinding>> space() {
  47. return this.getClass();
  48. }
  49. @Override
  50. protected void init() {
  51. render.init();
  52. }
  53. @Override
  54. protected void onCreate(Bundle savedInstanceState) {
  55. YUtils.showLoading(this, "加载中...");
  56. deliveryDao = new DeliveryDao(this);
  57. super.onCreate(savedInstanceState);
  58. }
  59. // 在活动由不可见变为可见的时候调用
  60. @Override
  61. protected void onStart() {
  62. super.onStart();
  63. // 调用H5 Javascript
  64. String jsCode = getCallStartJavascript();
  65. if (StringUtils.isNotEmpty(jsCode)) {
  66. viewBinding.webView.evaluateJavascript(jsCode, null);
  67. }
  68. }
  69. @Override
  70. protected void onDestroy() {
  71. super.onDestroy();
  72. if (deliveryDao != null) {
  73. deliveryDao.close(); // 在 DeliveryDao 中添加关闭方法
  74. }
  75. viewBinding.webView.clearCache(true); // 清除缓存
  76. viewBinding.webView.clearHistory(); // 清除历史记录
  77. viewBinding.webView.clearFormData(); // 清除表单数据
  78. }
  79. @Override
  80. public boolean onKeyDown(int keyCode, KeyEvent event) {
  81. if (keyCode == KeyEvent.KEYCODE_BACK) {
  82. this.moveTaskToBack(true);
  83. return true;
  84. }
  85. return super.onKeyDown(keyCode, event);
  86. }
  87. /**
  88. * 获取Header
  89. */
  90. public Map<String, String> getHeaderParams() {
  91. Map<String, String> params = new HashMap<>();
  92. params.put("Source", "app");
  93. return params;
  94. }
  95. /**
  96. * 页面渲染
  97. */
  98. private class Render {
  99. @SuppressLint("SetJavaScriptEnabled")
  100. private void init() {
  101. CookieManager cookieManager = CookieManager.getInstance();
  102. cookieManager.setAcceptCookie(true);
  103. cookieManager.setAcceptThirdPartyCookies(viewBinding.webView, true);
  104. WebSettings webSettings = viewBinding.webView.getSettings();
  105. // 基础设置
  106. webSettings.setJavaScriptEnabled(true);
  107. webSettings.setDomStorageEnabled(true);
  108. webSettings.setAllowFileAccess(true);
  109. // 推荐增加的现代缓存配置
  110. webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); // 使用默认缓存策略
  111. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  112. webSettings.setSafeBrowsingEnabled(true); // 启用安全浏览
  113. }
  114. // JavaScript 接口
  115. viewBinding.webView.addJavascriptInterface(
  116. new JavaScriptInterface(getActivity(), getHeaderParams(), viewBinding.webView, deliveryDao),
  117. "android"
  118. );
  119. this.inject();
  120. // 加载h5
  121. viewBinding.webView.loadUrl(getWebViewUrl(), getHeaderParams());
  122. }
  123. // 注入web加载点
  124. private void inject() {
  125. viewBinding.webView.setWebViewClient(new WebViewClient() {
  126. // 开始加载页面
  127. @Override
  128. public void onPageStarted(WebView view, String url, Bitmap favicon) {
  129. super.onPageStarted(view, url, favicon);
  130. LogUtil.d("onPageStarted: " + url);
  131. }
  132. // 完成页面加载
  133. @Override
  134. public void onPageFinished(WebView view, String url) {
  135. LogUtil.d("onPageFinished: " + url);
  136. super.onPageFinished(view, url);
  137. YUtils.hideLoading();
  138. }
  139. // 页面加载失败
  140. @Override
  141. public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
  142. super.onReceivedError(view, request, error);
  143. LogUtil.e("WebView加载失败url: " + request.getUrl().toString());
  144. LogUtil.e("WebView加载失败原因: " + error.getDescription());
  145. ToastUtil.showCenter("页面加载失败!" + error.getDescription());
  146. }
  147. // 拦截页面资源请求
  148. @Nullable
  149. @Override
  150. public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
  151. LogUtil.d("请求地址= " + request.getUrl().toString());
  152. return super.shouldInterceptRequest(view, request);
  153. }
  154. });
  155. }
  156. }
  157. }