【问题标题】:how to save & restore Webview State?如何保存和恢复 Webview 状态?
【发布时间】:2013-08-31 00:45:55
【问题描述】:

当我使用备份和恢复 Webview 状态时,我收到此消息: x 地址处的网页可能暂时关闭或可能已永久移动到新网址。

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    webViewShowPoll.saveState(savedInstanceState);                                    
}

@Override
public void onRestoreInstanceState(Bundle outState) {
  super.onRestoreInstanceState(outState);
    webViewShowPoll.restoreState(outState);
}

和 Androidmanifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.SET_DEBUG_APP"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    


    <activity
        android:name="com.omid.epoll.mobile.Poll"
        android:launchMode="singleInstance"
        android:label="@string/title_activity_poll" 
        android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
    </activity>

【问题讨论】:

  • 我做了以下事情:stackoverflow.com/a/27020832/2413303
  • 如果您使用 ajax 将部分视图加载到视口中,可能会出现问题。在这种情况下,您可能需要使用 javascript 通知 webview 部分加载。

标签: android webview


【解决方案1】:
 if (isInternetPresent) {
        // Internet Connection is Present
        // make HTTP requests
        // showAlertDialog(HomeScreen.this, "Internet Connection",
        // "You have internet connection", true);

        webviewbrowse.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
        webviewAds.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
        webviewbrowse.loadUrl("http://www.example.com");
    } else {
        // Internet connection is not present
        // Ask user to connect to Internet
        webviewbrowse.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        webviewAds.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        webviewbrowse.loadUrl("http://example.com");
        showAlertDialog(HomeScreen.this, "internet doesn't connect",
                " please connect to internet", false);
    }

【讨论】:

    【解决方案2】:

    restoreState 从不可靠。这也许就是文档现在这么说的原因。

    如果在这个 WebView 有机会建立状态之后调用它 (加载页面、创建后退/前进列表等)可能有 不良副作用。请注意,此方法不再 恢复此 WebView 的显示数据。

    saveState() 对应的条目是这样说的:

    请注意,此方法不再存储显示数据 这个 WebView。

    你真正应该在 onCreate 方法中做的是调用 webView.loadUrl() 如果你想显示最后访问的 url,请看这个answer:

    如果您担心 webview 在方向更改等时重新加载。

    你可以设置你的 Activity 来处理方向和keyboardHidden的变化,然后就不用WebView了

    【讨论】:

    • 这是对文档的过度偏执阅读。丢失“显示数据”很好。这意味着页面在翻转发生时重新加载。第一个警告简单归结为:在对 WebView 执行任何其他操作之前执行 restoreState。当前页面、历史记录保存和恢复;所以你不需要在 restoreState 之后调用 webView.loadUrl():保存页面的显示数据将被重新加载。没问题。只要您先执行 restoreState,它就完全可靠。
    • 现在谷歌正在推广“单一活动”应用程序,我不确定你的最后一句话是否可用......我一直试图阻止 webView 在方向更改时重新加载,我还是想不通。
    • 请注意,这个答案已经超过 4 年了。请随时添加您自己的与当今背景相关的答案。
    【解决方案3】:
         binding.webView.setWebViewClient(new WebViewClient() {
             public boolean shouldOverrideUrlLoading(WebView view, String url) {
                 view.loadUrl(url);
                 return true;
             }
    
             @Override
             public void onPageStarted(WebView view, String url, Bitmap favicon) {
                 super.onPageStarted(view, url, favicon);
             }
    
             @Override
             public void onPageFinished(WebView view, String url) {
                 super.onPageFinished(view, url);
             }
         }
        );
    
        binding.webView.getSettings().setJavaScriptEnabled(true);
        binding.webView.getSettings().setBuiltInZoomControls(true);
        binding.webView.getSettings().setDisplayZoomControls(false);
        binding.webView.getSettings().setAppCacheMaxSize( 5 * 1024 * 1024 );
        binding.webView.getSettings().setAppCachePath( getActivity().getApplicationContext().getCacheDir().getAbsolutePath() );
        binding.webView.getSettings().setAllowFileAccess( true );
        binding.webView.getSettings().setAppCacheEnabled( true );
        binding.webView.getSettings().setCacheMode( WebSettings.LOAD_DEFAULT );
        if ( !ConnectivityStatus.Companion.isConnected(getContext()) ) { // loading offline
            binding.webView.getSettings().setCacheMode( WebSettings.LOAD_CACHE_ELSE_NETWORK );
        }
        binding.webView.loadUrl(this.url);
    

    【讨论】:

      【解决方案4】:

      如果您的 WebView 在 Fragment 中,请检查以下内容:

      保存:

      @Override
      public void onSaveInstanceState(Bundle outState) {
          webView.saveState(outState); // output would be a WebBackForwardList
      }
      

      You may check the doc for saveState.

      恢复:

      @Override
      public void onCreate(Bundle savedInstanceState) {
          ...
      
          if (savedInstanceState != null) {
              webView.restoreState(savedInstanceState);
          } else {
              webView.loadUrl("http://mypage");
          }
      }
      

      【讨论】:

      • 你不应该在onCreate()中调用webView.restoreState()而不是webView.saveState()吗?
      猜你喜欢
      • 2011-07-23
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多