androidandroid-webviewandroid-serviceandroid-networking

Running WebView in Background


I am developing an application which utilizes a WebView to sign into a website, pull content from it, then notify the user when content is updated. I have gotten the WebView to get the content however I need to know how I can run the WebView as Service in order to get it to run in the background.

As I understand, WebViews must be manipulated from the UI thread which makes things a whole lot harder.

Any suggestions/workarounds as to how I can get the app to notify the user regardless of whether they have the app open or not?


Solution

  • While WebViews need to be manipulated on a single thread it doesn't necessarily need to be the UI thread (unless you want to attach the WebView to the view hierarchy), however it needs to be the same thread for all of the WebViews.

    While it's not something explicitly supported (or heavily tested) there is nothing special that the WebView does to prevent you from running it in a Service.

    For example:

    public class WebViewService extends Service {
      protected WebView mWebView;
    
      @Override
      public void onCreate() {
        super.onCreate();
        mWebView = new WebView(getApplicationContext());
      }
      
      // ...
    }
    

    The WebView does call a couple of methods on the Context that don't normally work in a Service (like getTheme()), so you'd have to work around that with a ContextWrapper.

    You'll also need to manually call WebView.layout to trick the WebView into thinking it has a size:

    int width = 1080;
    int height = 1920;
    mWebView.layout(0, 0, width, height);
    

    There might be more stuff you'd need to do, but nothing else comes to mind.