Save webview content to android storage and load it

后端 未结 1 501
隐瞒了意图╮
隐瞒了意图╮ 2020-12-09 00:17

I want to make an android application which has a webview layout. This is the criteria of my application:

  1. The first time the application starts, webview loa

相关标签:
1条回答
  • 2020-12-09 00:54

    You can use a Javascript interface for the WebView to return the entirety of the HTML source when the page is finished loading. To do this, you'll need to assign your own WebViewClient to the WebView.

    To do this, use something similar to the following in your Activity class -- Make sure your Activity implements Observer:

    public void onCreate(Bundle savedInstanceState) {
        // ...
    
        webView.setWebViewClient(new MyWebViewClient());
        HtmlJSInterface htmlJSInterface = new HtmlJSInterface();
        webView.addJavascriptInterface(htmlJSInterface, "HTMLOUT");
        htmlJSInterface.addObserver(this);
    
        // ...
    }
    
    // Called when our JavaScript Interface Observables are updated.
    @Override
    public void update(Observable observable, Object observation) {
    
        // Got full page source.
        if (observable instanceof HtmlJSInterface) {
            html = (String) observation;
            onHtmlChanged();
        }
    }
    
    private void onHtmlChanged() {
        // Do stuff here...
    }
    
    private class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    
        @Override
        public void onPageFinished(WebView view, String url) {
            // When each page is finished we're going to inject our custom
            // JavaScript which allows us to
            // communicate to the JS Interfaces. Responsible for sending full
            // HTML over to the
            // HtmlJSInterface...
            isStarted = false;
            isLoaded = true;
            timeoutTimer.cancel();
            view.loadUrl("javascript:(function() { "
                    + "window.HTMLOUT.setHtml('<html>'+"
                    + "document.getElementsByTagName('html')[0].innerHTML+'</html>');})();");
            }
        }
    }
    

    Then, you're going to want to create the HtmlJSInterface class, as such:

       public class HtmlJSInterface extends Observable {
      private String html;
    
      /**
       * @return The most recent HTML received by the interface
       */
      public String getHtml() {
        return this.html;
      }
    
      /**
       * Sets most recent HTML and notifies observers.
       * 
       * @param html
       *          The full HTML of a page
       */
      public void setHtml(String html) {
        this.html = html;
        setChanged();
        notifyObservers(html);
      }
    }
    
    0 讨论(0)
提交回复
热议问题