android webview activity 单例无效

本文探讨了Android中WebViewActivity使用单例模式时遇到的问题:当再次进入包含WebView的Activity时,发现依然会重新加载网页,而非从单例状态恢复。文章将进一步分析问题所在。

android webview activity 单例无效

 

再次进入含webview的activity,仍然重新请求网页,

 

问题何在?

 

待续

package com.whmappcs.wuyang.module_web.ui; import android.Manifest; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Message; import android.util.AttributeSet; import android.util.Log; import android.webkit.JavascriptInterface; import android.webkit.RenderProcessGoneDetail; import android.webkit.ValueCallback; 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 androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; import androidx.fragment.app.FragmentActivity; //import com.baidu.mobstat.StatService; import com.blankj.utilcode.util.ActivityUtils; import com.blankj.utilcode.util.ViewUtils; import com.github.lzyzsd.jsbridge.BridgeWebView; import com.github.lzyzsd.jsbridge.BridgeWebViewClient; import com.github.lzyzsd.jsbridge.DefaultHandler; import com.luck.picture.lib.basic.PictureSelector; import com.luck.picture.lib.config.SelectMimeType; import com.luck.picture.lib.entity.LocalMedia; import com.luck.picture.lib.interfaces.OnResultCallbackListener; import com.sensorsdata.analytics.android.sdk.visual.bridge.JSBridgeHelper; import com.whmappcs.wuyang.module_web.mallplugin.MallAccountPlugin; import com.whmappcs.wuyang.module_web.mallplugin.MallAppCachePlugin; import com.whmappcs.wuyang.module_web.mallplugin.MallBasePlugin; import com.whmappcs.wuyang.module_web.mallplugin.MallBindWeChatPlugin; import com.whmappcs.wuyang.module_web.mallplugin.MallCommunityDownloadTokenPlugin; import com.whmappcs.wuyang.module_web.mallplugin.MallDefaultCarPlugin; import com.whmappcs.wuyang.module_web.mallplugin.MallDialogPlugin; import com.whmappcs.wuyang.module_web.mallplugin.MallJumpAddressPlugin; import com.whmappcs.wuyang.module_web.mallplugin.MallJumpToStorePlugin; import com.whmappcs.wuyang.module_web.mallplugin.MallMapPlugin; import com.whmappcs.wuyang.module_web.mallplugin.MallMobilePlugin; import com.whmappcs.wuyang.module_web.mallplugin.MallNotificationPlugin; import com.whmappcs.wuyang.module_web.mallplugin.MallPermissionPlugin; import com.whmappcs.wuyang.module_web.mallplugin.MallPhotoPlugin; import com.whmappcs.wuyang.module_web.mallplugin.MallShareDigitalKeyDetailPlugin; import com.whmappcs.wuyang.module_web.mallplugin.MallSharedPlug; import com.whmappcs.wuyang.module_web.mallplugin.MallVehicleSeriesModelListPlugin; import com.whmappcs.wuyang.module_web.mallplugin.MallVideoUrlPlugin; import com.whmappcs.wuyang.module_web.mallplugin.getMallDownloadTokenPlugin; import com.whmappcs.wuyang.module_web.plugin.AccountPlugin; import com.whmappcs.wuyang.module_web.plugin.AppCachePlugin; import com.whmappcs.wuyang.module_web.plugin.BasePlugin; import com.whmappcs.wuyang.module_web.plugin.BindWeChatPlugin; import com.whmappcs.wuyang.module_web.plugin.CarListPlugin; import com.whmappcs.wuyang.module_web.plugin.CommunityDownloadTokenPlugin; import com.whmappcs.wuyang.module_web.plugin.DefaultCarPlugin; import com.whmappcs.wuyang.module_web.plugin.DialogPlugin; import com.whmappcs.wuyang.module_web.plugin.JumpAddressPlugin; import com.whmappcs.wuyang.module_web.plugin.JumpToStorePlugin; import com.whmappcs.wuyang.module_web.plugin.MallDownloadTokenPlugin; import com.whmappcs.wuyang.module_web.plugin.MapPlugin; import com.whmappcs.wuyang.module_web.plugin.MobilePlugin; import com.whmappcs.wuyang.module_web.plugin.NotificationPlugin; import com.whmappcs.wuyang.module_web.plugin.PermissionPlugin; import com.whmappcs.wuyang.module_web.plugin.PhotoPlugin; import com.whmappcs.wuyang.module_web.plugin.ShareDigitalKeyDetailPlugin; import com.whmappcs.wuyang.module_web.plugin.SharedPlug; import com.whmappcs.wuyang.module_web.plugin.VehicleSeriesModelListPlugin; import com.whmappcs.wuyang.module_web.plugin.VideoUrlPlugin; import com.whmappcs.wuyang.module_web.ui.webview.BaseWebViewClient; import com.whmappcs.wuyang.module_web.ui.webview.BaseWebview; import com.whmappcs.wuyang.module_web.utils.CusBridgeWebViewClient; import com.whmappcs.wuyang.module_web.utils.GlideEngine; import com.whmappcs.wuyang.module_web.utils.MallCusBridgeWebViewClient; import com.xz.common.log.LogUtils; import com.xz.common.utils.CommonToastUtils; import com.xz.common.utils.ListUtils; import java.io.File; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class MallWebView extends BaseWebview implements MallPhotoPlugin.IPhotoCallBack, MallCusBridgeWebViewClient.IReceivedErrorListener { private final String TAG = CusWebView.class.getSimpleName(); int maxImagesCount = 9; //图片选择最大数量 ValueCallback<Uri[]> mUploadMessage; private final LinkedList<MallBasePlugin> pluginHashMap = new LinkedList<>(); MallCusBridgeWebViewClient.IReceivedErrorListener receivedErrorListener; MallWebView.onProgressChanged onProgressChanged; Boolean isGlideEngine=false; private Context mContext; public MallWebView(@NonNull Context context) { this(context,null); mContext = context; } public MallWebView(@NonNull Context context, @Nullable AttributeSet attrs) { //注意别动,这个改了H5会键盘弹不出来 super(context, attrs); mContext = context; init(); } public MallWebView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mContext = context; init(); } public void init(){ this.setDefaultHandler(new DefaultHandler()); // settings(); // registerPlugin(); } @JavascriptInterface public void testJsCall() { Log.d("MallWebView", "JS 调用成功"); } @Override protected BaseWebViewClient generateBridgeWebViewClient() { return new MallCusBridgeWebViewClient(this,this,onProgressChanged); } private boolean handleWeChatRedirect(String url) { try { Intent intent=null; if (url.startsWith ("weixin://")) { intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); intent.setPackage("com.tencent.mm"); ActivityUtils.getTopActivity().startActivity(intent); return true; }else if(url.startsWith("alipays://")){ url = "alipays://platformapi/startapp?appId=20000067&url=${url}"; intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); ActivityUtils.getTopActivity().startActivity(intent); return true; }else{ return false; } } catch (Exception ex){ if (url.startsWith ("weixin://")) { CommonToastUtils.show("未安装微信,请先安装微信"); }else if(url.startsWith("alipays://")){ CommonToastUtils.show("未安装支付宝,请先安装支付宝"); } return false; } } @JavascriptInterface @SuppressLint("SetJavaScriptEnabled") public void settings(){ WebSettings webSettings = getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); WebChromeClient webChromeClient = new WebChromeClient() { @Override public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) { WebViewClient webViewClient = new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { String url = request.getUrl().toString(); if(handleWeChatRedirect(url)){ return true; } return super.shouldOverrideUrlLoading(view, request); // 加入父类调用 } }; view.setWebViewClient(webViewClient); return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg); } @SuppressWarnings("unused") public void openFileChooser(ValueCallback<Uri> uploadMsg, String AcceptType, String capture) { this.openFileChooser(uploadMsg); } @SuppressWarnings("unused") public void openFileChooser(ValueCallback<Uri> uploadMsg, String AcceptType) { this.openFileChooser(uploadMsg); } public void openFileChooser(ValueCallback<Uri> uploadMsg) { } @Override public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) { mUploadMessage = filePathCallback; final String reqPermission = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU? Manifest.permission.READ_MEDIA_IMAGES:Manifest.permission.READ_EXTERNAL_STORAGE; boolean isHaveReadPermission = ActivityCompat.checkSelfPermission(getContext(),reqPermission) == PackageManager.PERMISSION_GRANTED; boolean isHasCameraPermission = ActivityCompat.checkSelfPermission(getContext(),Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED; LogUtils.d(TAG,"onShowFileChooser isHaveReadPermission = "+ isHaveReadPermission + " isHasCameraPermission="+ isHasCameraPermission); if (isHasCameraPermission && isHaveReadPermission ) { openPhoto(); } return true; } @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); if(newProgress == 100){ if (onProgressChanged != null) { onProgressChanged.onProgressChanged(true); } } LogUtils.e(TAG, "onProgressChanged:" + newProgress); } }; this.setWebChromeClient(webChromeClient); // 适用于自动埋点版本,用于对webview加载的h5页面进行自动统计;需要在载入页面前调用,建议在webview初始化时刻调用 // 如果有设置的WebChromeClient,则需要将对象传入,否则影响本身回调;如果没有,第三个参数设置为null即可 // StatService.trackWebView(getContext(), this, webChromeClient); //设置自定义userAgent String defaultUA = webSettings.getUserAgentString(); String customUA = defaultUA + " Honda_ANDROIDAPP"; webSettings.setUserAgentString(customUA); LogUtils.d(TAG,"getUserAgentString--->"+ webSettings.getUserAgentString()); } public void setonProgressChanged(MallWebView.onProgressChanged onProgressChanged) { this.onProgressChanged = onProgressChanged; } public interface onProgressChanged{ void onProgressChanged(boolean progressChanged); } @JavascriptInterface public void registerPluginWebview(MallWebView webView){ pluginHashMap.add(new getMallDownloadTokenPlugin(webView)); pluginHashMap.add(new MallAccountPlugin(webView)); pluginHashMap.add(new MallAppCachePlugin(webView)); pluginHashMap.add(new MallDialogPlugin(webView)); // pluginHashMap.add(new PermissionPlugin(this)); pluginHashMap.add(new MallPhotoPlugin(webView,this)); pluginHashMap.add(new MallDefaultCarPlugin(webView)); pluginHashMap.add(new MallMobilePlugin(webView)); pluginHashMap.add(new MallBindWeChatPlugin(webView)); pluginHashMap.add(new MallShareDigitalKeyDetailPlugin(webView)); pluginHashMap.add(new MallJumpAddressPlugin(webView)); pluginHashMap.add(new MallAccountPlugin(webView)); pluginHashMap.add(new MallVideoUrlPlugin(webView)); pluginHashMap.add(new MallMapPlugin((FragmentActivity)ActivityUtils.getTopActivity(),webView)); pluginHashMap.add(new MallJumpToStorePlugin((FragmentActivity)ActivityUtils.getTopActivity(), webView)); pluginHashMap.add(new MallPermissionPlugin((FragmentActivity)ActivityUtils.getTopActivity(), webView)); pluginHashMap.add(new MallNotificationPlugin((FragmentActivity)ActivityUtils.getTopActivity(),webView)); pluginHashMap.add(new MallVehicleSeriesModelListPlugin((FragmentActivity)ActivityUtils.getTopActivity(), webView)); pluginHashMap.add(new MallSharedPlug((FragmentActivity)ActivityUtils.getTopActivity(), webView)); pluginHashMap.add(new MallCommunityDownloadTokenPlugin(webView)); } @JavascriptInterface public void registerPlugin(MallBasePlugin plugin){ pluginHashMap.add(plugin); } public void setReceivedErrorListener(MallCusBridgeWebViewClient.IReceivedErrorListener receivedErrorListener) { this.receivedErrorListener = receivedErrorListener; } public void openPhoto(){ int chooseMode= SelectMimeType.ofAll(); if(isGlideEngine){ chooseMode = SelectMimeType.ofImage(); } PictureSelector.create(getContext()) .openGallery(chooseMode) .setImageEngine(GlideEngine.createGlideEngine()) .isPreviewVideo(true) // 启用 GIF 预览 .isGif(true) // 启用 GIF 选择 .setMaxSelectNum(maxImagesCount) .forResult(new OnResultCallbackListener<LocalMedia>() { @Override public void onResult(ArrayList<LocalMedia> result) { new Thread(new Runnable() { @Override public void run() { ViewUtils.runOnUiThread(new Runnable() { @Override public void run() { List<Uri> uriList = new ArrayList<>(); for(LocalMedia media : result){ File file = new File(media.getRealPath()); Uri uri = Uri.fromFile(file); if(null != uri){ uriList.add(uri); } } if (mUploadMessage != null) { if(ListUtils.isNotEmpty(uriList)){ mUploadMessage.onReceiveValue(uriList.toArray(new Uri[0])); }else { mUploadMessage.onReceiveValue(null); } mUploadMessage = null; } } }); } }).start(); } @Override public void onCancel() { if (mUploadMessage != null) { mUploadMessage.onReceiveValue(null); mUploadMessage = null; } } }); } @Override public void getUserImageSize(int maxImagesCount) { this.maxImagesCount = maxImagesCount; } @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { //处理加载失败回调 if(receivedErrorListener != null){ receivedErrorListener.onReceivedError(view,request,error); } } @Override public void onRenderProcessGone(WebView view, RenderProcessGoneDetail detail) { //处理加载失败回调 if(receivedErrorListener != null){ receivedErrorListener.onRenderProcessGone(view,detail); } } public void setImageEngine(Boolean isGlideEngine){ this.isGlideEngine=isGlideEngine; } /** * 结束调用 * */ public void onDestroy(){ onProgressChanged = null; setWebChromeClient(null); for(MallBasePlugin plugin : pluginHashMap){ plugin.onDestroy(); } pluginHashMap.clear(); } public void removePlugin(){ for(MallBasePlugin plugin : pluginHashMap){ plugin.onDestroy(); } pluginHashMap.clear(); } }已经独设置上下文,但是还是无法两个 webview 同时调用 API
最新发布
07-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值