【问题标题】:How to use WebView in an IntentService?如何在 IntentService 中使用 WebView?
【发布时间】:2024-01-19 05:29:01
【问题描述】:

我与this guy 的情况相同。我需要在IntentService 中使用WebView。总结一下:

  • 我需要使用 JavaScript 和管理 cookie,因此最简单的方法是使用某种无 GUI 浏览器。
  • 没有适用于 Android 的无 GUI 网络浏览器,因此我必须找到一种方法来使用 WebView 或找到一种方法来模拟浏览器。
  • 我想使用只能在 UI 线程上运行的 WebView 实例。

我的问题是:

  • 有没有办法序列化我的activitycontext,以便我可以使用这个context 来创建我的WebView
  • 如何使用 Androids ContextWrapper 类来模拟活动?

还有没有提到here的其他想法?一些值得思考的食物: Link1

【问题讨论】:

    标签: android webview intentservice


    【解决方案1】:

    没有适用于 Android 的无 GUI 网络浏览器

    虽然我最近没有尝试过,但WebView 至少过去对显示其 UI 没有特殊要求。我在Service 中使用了WebView,在我的情况下用于JavaScript 解释器(在我们有更好的选择之前)。

    现在,IntentService 不是一个好的选择。 WebView 很大程度上是异步的,IntentService 会在 WebView 有机会完成其工作之前自行销毁。使用常规的Service,您可以在其中控制Service 的生命周期,因此只有在您准备好时才能调用stopSelf()

    我想使用只能在 UI 线程上运行的 WebView 实例。

    WebView 和线程的关系很复杂。但是,当我上次尝试它时,IIRC,实际上并没有出现在屏幕上的WebView 不需要主应用程序线程。但是,正如我所指出的,WebView 的大部分工作都是异步完成的。您可能会发现您不需要自己的后台线程。

    有没有办法序列化我的活动的上下文,以便我可以使用这个上下文来创建我的 WebView?

    不会,也不会解决您的任何顾虑。

    如何使用 Android 的 ContextWrapper 类来模拟一个活动?

    这是不可能的,也不会解决您的任何顾虑。

    【讨论】:

    • 您好,我正在使用您的WakefulIntentService 的稍微修改过的版本(经过微调后可以在没有警报接收器的情况下工作)。我还创建了一个SyncBrowse 类,我用WebView 的实例对其进行初始化,它处理WebView 的异步行为。这个类一直等到我的 JS 被执行或者页面加载使用 JavaScriptInferance.wait() .notify() 完成。我应该担心我让我的 WakefulIntentService 等待这么久吗?仅供参考,这个应用程序不会被大量使用,每天只有几个人使用几个小时,ServiceAlarms 之间大约 1 小时。
    • @cozkul:“我应该担心让我的 WakefulIntentService 等待这么久吗?” -- 这不是WakefulIntentServiceIntentService 本身的设计目的。使用常规的Service,这样您就可以控制线程和服务生命周期。
    • 你好。我将所有内容移至Service。无法使用 Service 上下文初始化 WebView。当我在我的一个活动中声明static public Context 并使用它来初始化我的WebView 时,至少它会初始化,但是当您发出 webView.loadUrl() 命令时,应用程序仍然崩溃。你有什么想法来完成这项工作吗?
    • @cozkul:“无法使用服务上下文初始化 WebView”——正如我所写,它曾经可以工作。但是,自从我尝试它以来已经有一段时间了。你遇到了什么具体问题? “你有什么想法让这个工作吗?”——我建议你打开一个新的 Stack Overflow 问题,在其中提供你的代码、堆栈跟踪等。
    • 好的,谢谢。我将创建一个具有更好解释的新问题,并在明天提供代码。我发现当您使用静态上下文时,一切正常,但您必须在主 UI 线程上调用 loadUrl。
    最近更新 更多