我读过我应该打电话

startForegroundService(intent)

如果我想正确启动一个可以作为前台服务运行的服务。 但是,如果我希望它开始时不作为前台服务但可能在以后成为前台服务,我应该如何思考? 关于我们现在如何拥有它的一些信息:

我们有一个应用程序,它使用一项服务来完成许多任务。 当用户在前台与应用程序交互时,它会执行所有这些任务,但取决于用户是否启用了某个功能,我们希望继续在后台执行这些任务。 因此,当应用程序启动时(显然是在前台),我们使用

startService(intent);

当应用程序转入后台时,我们检查该功能是否已启用,如果已启用,则运行startForeground(id, notificiation); 这有效地在操作系统中添加了不可删除的通知,并且服务继续运行。 当应用程序返回前台时,我们调用stopForeground(true) 如果该功能未启用,该服务将永远不会被设置为前台服务,我们也不会尝试在后台执行这些任务。

所以我的问题是:这是否足以获得“完整的前台服务性能”? 或者我因为不调用startForegroundService(intent)失去了什么? 我的印象是我们实际上确实有一个完全可用的前台服务,但是当我读到foreground services must be started using startForegroundService(intent)我们没有做的foreground services must be started using startForegroundService(intent)声明时,我感到很困惑。 如果我们真的需要使用startForegroundService(intent) ,我能想到的唯一解决方案是最初启动一个普通的服务实例,当应用程序进入后台时,我们使用startForegroundService(intent)启动一个新的startForegroundService(intent) 但是我们是否需要这样做或者在使用startService(intent)启动的服务上运行startForegund(id, notification) startService(intent)足以实现前台服务?

注意:我发现的一个区别是,如果应用程序本身在启动服务时处于后台,那么我需要startForegroundService(intent) for API >= 26。在我们的例子中,我们总是在应用程序处于前台时启动服务。 然而,我确实记得一些实例,当我们尝试使用startService(intent)启动服务时,我看到了抛出的异常,不知何故应用程序(非常非常罕见)仍然认为它在后台(也许来自操作系统的某些东西出现在应用程序启动)。 因此,如果我发现这种情况发生时,我可以运行startForegroundService(intent)来启动服务。 但是当应用程序回到前台时,是否可以在该服务上运行stopForeground(true) 或者,自从我们以这种方式启动它后,它就一定会永远成为前台服务吗?

#1楼 票数:1

似乎您不必调用startForegroundService并且startService就足够了:

如果您的服务已启动(通过 Context#startService(Intent) 运行),那么还要使该服务在前台运行,在此状态下向用户提供持续通知。 默认启动的服务是后台的,这意味着它们的进程不会被给予前台 CPU 调度(除非该进程中的其他东西是前台),并且如果系统需要杀死它们以回收更多内存(例如显示大页面在网络浏览器中),它们可以被杀死而不会造成太大伤害。 如果终止您的服务会对用户造成干扰,例如您的服务正在播放背景音乐,那么您可以使用 startForeground(int, Notification),这样用户就会注意到他们的音乐是否停止播放。

文档

#2楼 票数:0

我多次阅读您的问题,我认为(希望)您的问题的答案是:

根据 Android 8.0 后台执行限制的官方文档:

Android 8.0 引入了新方法 startForegroundService() 以在前台启动新服务。 系统创建服务后,应用程序有五秒钟时间调用服务的 startForeground() 方法以显示新服务的用户可见通知。 如果应用在时限内没有调用 startForeground(),系统将停止服务并声明应用为 ANR。

因此,请确保您已通过在服务的 onCreate() 方法中调用 startForeground (int id, Notification notification) 来启动持续通知。

注意:针对 API Build.VERSION_CODES.P 或更高版本的应用程序必须请求权限 Manifest.permission.FOREGROUND_SERVICE 才能使用此 API。

Maciej Witowski发布了一篇很棒的中等文章,可以帮助您了解新服务 API 的真正工作原理: https : //proandroiddev.com/pitfalls-of-a-foreground-service-lifecycle-59f014c6a125

  ask by poppe translate from so

未解决问题?本站智能推荐:

3回复

Android后台服务判断前台应用

我正在开发一个应用程序,它将全天监控电话使用情况。 为此,我有一个后台服务,它在设备启动时启动并不断轮询以找出当前的前台应用程序是什么。 当我只是单击一个应用程序然后退出并单击另一个应用程序时,以下代码有效。 现在假设我打开浏览器并转到不同的网页,它将停止将浏览器注册为前台应用程序。 或者例如,我打
1回复

Android前台服务

故事是这样的:我创建了一个应用程序,该应用程序在启动时启动,并在指定的时间间隔执行一些操作。 为了实现这一点,我正在创建一个使用AlarmManager创建重复事件的服务,该事件随后由BroadcastReceiver处理,该工作繁重。 当服务被破坏(用户选择退出应用程序)时,该事件必须被取
2回复

与前台服务android通信

这是第一个问题,但我已经有一段时间了。 我有什么: 我正在构建一个播放音频流和在线播放列表的Android应用。 一切都工作正常,但我在与我的服务沟通时遇到问题。 音乐正在服务中播放,以startForeground开头,所以它不会被杀死。 我需要通过我的活动与服务进行
1回复

android前台服务可以监听按键吗?

我正在尝试编写一个可以监听音量按键的服务,但是我读过某个地方,该服务不应该对用户操作做出反应。 这也适用于前台服务吗? 谢谢!
1回复

如何按前台服务通知?

我有一个前台服务通知,我希望在用户关闭应用程序并按通知时再次打开该应用程序。我使用onClick()方法实现了一个onclicklistener,但它什么也没做。如果不可能,我希望“播放”按钮显示在通知中,因为仅在我扩展通知时才会显示。 这是服务类:
5回复

如何更新 Android 中前台服务的通知文本?

我在 Android 中有一个前台服务设置。 我想更新通知文本。 我正在创建如下所示的服务。 如何更新在此前台服务中设置的通知文本? 更新通知的最佳做法是什么? 任何示例代码将不胜感激。 我正在我的主要活动中创建服务,如下所示:
1回复

绑定服务和前台服务有什么区别?

我试图创建一个服务,该服务可以在打开应用程序时与AppUI交互,并在关闭应用程序时继续其工作。 我听说bindService()调用创建了可以与App通信的绑定服务。 同时,一些资源说,可以通过在onStartCommand()回调内调用startForeground() ,然后使用它们
1回复

如何在Qt Android中启动前台服务?

我想创建一个前台服务,即使在qt中关闭该应用程序后也可以使用。 我阅读了https://doc.qt.io/qt-5/android-services.html简单服务可以成功运行,但是当我尝试在函数中启动前台服务时 编译器这样写 我究竟做错了什么? 为什么“ startService”有效