【问题标题】:Run service frequently also after app was closed应用程序关闭后也经常运行服务
【发布时间】:2019-10-01 10:53:50
【问题描述】:

对于我的应用,我想在后台从服务器获取数据。当用户希望收到有关特定更改的通知时,我希望我的应用程序即使在应用程序关闭时也能继续获取数据。我正在研究这个主题,发现在应用程序关闭后继续运行服务的可能性随着 Android Oreo 的变化而改变。我没有看到使用较新版本的 android 在后台处理运行服务的替代方案。我看到的最推荐的解决方案是使用前台服务。但由于我没有任何用户交互,我认为这个解决方案并不完美。我还阅读了有关 WorkManager 的信息,但不幸的是它的最短时间间隔为 15 分钟。除了前台服务和 WorkManager,还有其他替代方案可以在后台连续处理数据吗?

【问题讨论】:

  • 我理解您想在后台轮询您的服务器并在有任何更改时获取和处理该数据?在这种情况下,您将不得不处理 WorkManagers 15 分钟间隔的限制。另一种(更好的)方法是让您的服务器通过推送消息通知客户端有关更改(想想 Firebase 云消息传递)。此消息会短暂唤醒您的应用,但时间足以从您的 API 获取最新数据。

标签: java android android-service


【解决方案1】:

您不需要“用户交互”来拥有前台服务,您需要的是在服务处于前台时无法删除的通知。

如果您的通知上下文是服务本身,点击通知会将用户带到他/她可以强制关闭服务的“设置”中)。

您可以在 BOOT_COMPLETED 广播接收器中启动 FG 服务。您必须快速(5 秒或更短)将其发送到前台,否则 android 会抛出异常。不幸的是,there's a bug 谷歌认为它没问题并以“无法修复”而关闭,但你仍然需要解决。

长话短说,在你的服务中有一个 onCreate:


    @Override
    public void onCreate() {
        super.onCreate();

        final Notification notification = createNotification();
        startForeground("SOME_UNIQUE_ID", notification);
    }

您明白了(createNotification() 是您想要创建频道(如果 O+)+ 通知的任何内容。

然而,这一切都很好,但它会一直运行一个服务,这可能不是你应该做的。

您可以使用警报触发更有效的(就范围而言)意图服务来完成工作,安排另一个警报,例如 5 分钟,然后再做一次。

或者 - 如评论所述 - 您可以使用 Firebase 和通知来对更改做出反应。

总而言之,这些都是选项。

我想说,除非你真的需要“实时”更新,否则 WorkManager 的 15 ~ 通常是可以的,如果你能处理你必须将代码设计得非常独立的事实,因为 WorkManager 无法接收信息量大,有些东西用起来很痛苦……

【讨论】:

  • 非常感谢您的回答!通知是否需要做任何事情,或者它也可以没有效果,你知道吗?前台服务也适用于所有安卓版本,对吗?
  • 通知不需要“做”任何事情。您可以提供图标、标题和“内容”。如果您提供图标,标题和内容将无法正确显示(“按设计”),但除此之外,通知不需要执行任何其他操作,只需显示即可...你一开始就无法避免。前台服务已经存在了一段时间,并且可用于旧的 API 级别。您应该阅读official documentation 的服务,以确保您了解需要什么。
  • 好的,我明白了。现在我正在使用一个在应用程序打开时在后台运行的服务。当应用程序现在关闭时,我是否必须停止后台服务并启动前台服务,反之亦然,当应用程序再次启动时,还是有其他更推荐的方法来保持服​​务正在执行?
  • 一个服务可以被提升到前台(然后回到后台)而不需要重新启动它。有很多方法可以解决这个问题,一种是将意图传递给服务并传递一些键/值(例如:键:SEND_TO_FG,值:true)并在您的onStartCommand(...) 中检查此标志并调用:startForeground(notification)stopForeground(true) //true = remove notification, false = keep it) Activity 可以发信号通知服务做同样的事情;所有这些都可以在文档中找到。
  • 非常感谢您的建议,我能够解决它!关于前台服务的一般理解,我还有最后一个问题。当服务启动并且应用程序关闭时,是只有服务保持活动状态并且所有活动都被杀死,还是整个应用程序仍在运行并具有其所有功能?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多