首页 > 解决方案 > 重新打开的应用程序不会在 webview 中加载 url

问题描述

我有一个带有 WebView 的片段,用于打开 url 并登录到某些服务,然后接收一些 cookie。问题是,当我在活动中打开应用程序和片段时,url 会正常加载到 WebView 中,但是当我关闭应用程序(以编程方式使用activity.finishAndRemoveTask())并再次(手动)打开它时 - url 不会加载。下一次应用程序重新启动(手动)后,一切恢复正常。我要打开的网址有两个重定向。

这是我的片段类:

public class MyFragment extends Fragment implements WebResourceClient.CookieListener {

    private String URL = "https://someurl.com";

    @OnClick(R.id.close)
    public void detachFragment() {
        FragmentManager manager = getFragmentManager();
        if (manager != null) {
            manager.popBackStackImmediate();
        }
    }

    @BindView(R.id.web_container)
    WebView webContainer;

    @BindView(R.id.progress_bar)
    ProgressBar progressBar;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.ny_fragment, container, false);
        ButterKnife.bind(this, view);
        startWebView();
        return view;
    }

    @SuppressLint("SetJavaScriptEnabled")
    private void startWebView() {
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.removeAllCookies(null);

        WebSettings settings = webContainer.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setDomStorageEnabled(true);
        settings.setUseWideViewPort(true);
        settings.setLoadWithOverviewMode(true);
        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
        settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        settings.setMediaPlaybackRequiresUserGesture(false);
        settings.setUserAgentString(Core.USER_AGENT_FOR_GOOGLE);
        settings.setAppCacheEnabled(false);

        webContainer.clearCache(true);
        WebView.setWebContentsDebuggingEnabled(false);
        webContainer.setWebViewClient(new WebResourceClient(this));
        webContainer.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                if (newProgress < 100) {
                    webContainer.setVisibility(View.INVISIBLE);
                    progressBar.setVisibility(View.VISIBLE);
                } else {
                    webContainer.setVisibility(View.VISIBLE);
                    progressBar.setVisibility(View.INVISIBLE);
                }
            }
        });

        webContainer.loadUrl(URL);
    }

    @Override
    public void onDestroyView() {
        webContainer.stopLoading();
        super.onDestroyView();
    }

    @Override
    public void onReceiveCookie(String cookie) {
        detachFragment();
        ...
    }

    @Override
    public void showProgress() {
        webContainer.setVisibility(View.INVISIBLE);
        progressBar.setVisibility(View.VISIBLE);
    }
}

这是我的 WebViewClient:

public class WebResourceClient extends WebViewClient {


    private final static String someUrl = "https://someOtherUrl";

    private CookieListener listener;

    public WebResourceClient(CookieListener listener) {
        this.listener = listener;
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        String url = request.getUrl().toString();
        if (url.contains(someUrl)) {
            listener.showProgress();
        }
        view.loadUrl(url);
        return true;
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.contains(someUrl)) {
            listener.lockWebView();
        }
        view.loadUrl(url);
        return true;
    }

    @Override
    public void onPageFinished(WebView view, String url) {
//        if (url.contains(someUrl)) {
        String cookies = CookieManager.getInstance().getCookie(url);
        String cookie = getCookie(cookies);
        if (!TextUtils.isEmpty(cookie)) {
            view.stopLoading();
            listener.onReceiveCookie(cookie);
        }
        super.onPageFinished(view, url);
    }

    private String getCookie(String cookies) {
       ...
    }

    public interface GoogleLoginListener {
        void onReceiveCookie(String cookie);

        void showProgress();
    }
}

我像那里一样打开片段:

MyFragment fragment = new MyFragment();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction tr = fm.beginTransaction();
tr.addToBackStack(fragment.getClass().getSimpleName());
tr.replace(R.id.fragment_root, fragment);
tr.commit();

标签: javaandroidwebview

解决方案


推荐阅读