在后台运行WebView

use*_*871 7 android android-service android-networking android-webview

我正在开发一个应用程序,它利用WebView登录网站,从中提取内容,然后在内容更新时通知用户.我已经获得了WebView来获取内容,但是我需要知道如何将WebView作为服务运行以使其在后台运行.

据我所知,必须从UI线程操纵WebViews,这使得事情变得更加艰难.

有关如何让应用程序通知用户的任何建议/解决方法,无论他们是否打开了应用程序?

mar*_*iba 9

虽然WebView需要在单个线程上进行操作,但它不一定需要是UI线程(除非您想将WebView附加到视图层次结构中),但是它必须是所有WebView的相同线程.

虽然它没有明确支持(或经过严格测试),但WebView没有做任何特殊的事情来阻止您在服务中运行它.WebView确实在Context上调用了几个通常不在Service中工作的方法(比如getTheme()),所以你必须使用ContextWrapper解决这个问题.您还需要手动调用WebView.layout以欺骗WebView以使其具有大小.你可能需要做更多的事情,但没有别的想法.

  • 好的,现在它一定是一个 UI 线程。没什么大不了的,我们仍然可以从后台应用程序向 UI 线程发布可运行的内容,并且一切都运行良好。但是如何使用服务上下文创建 WebView,而不创建活动或透明的零大小窗口(需要 SYSTEM_ALERT_WINDOW 权限,我想避免......)一些 Java 或 Kotlin 代码的概述将不胜感激。 。 (3认同)
  • 这似乎不再是真实的 - 似乎_must_是UI线程.当我尝试在另一个线程中创建WebView时,我得到:"java.lang.RuntimeException:java.lang.Throwable:Warning:在线程'UtilityWebViewServiceThread'上调用了一个WebView方法.必须在UI线程上调用所有WebView方法.未来版本的WebView可能不支持在其他线程上使用." (2认同)