安卓Oreo上的永久服务

4
Android 8的电池消耗改进对用户来说很好,但我有点担心我的服务能否按预期工作。
首先:感谢任何建议,但我不能只是安排我的服务。我想让一个类似于“OK Google”的关键词监听器一直在后台运行。它将基于开源pocketsphinx-android库。我知道这会消耗很多电池电量,我会告知用户。
我们可以在Android 8+上创建一个永久后台服务吗?我需要在gradle中针对android 8进行目标设置,因为我预计旧版本存在一些错误。我也不想打扰用户使用前台服务,该服务会在状态栏中永久显示通知。
[https://developer.android.com/about/versions/oreo/background.html] - 真的没有办法使我的用例(但最好是所有用例)成为可能的永久后台服务吗?

实际上,没有一种干净的方式可以无限期地运行后台服务。如果您想要持续工作,您的应用程序的某个部分必须处于前台。 - zsmb13
我们能在安卓8+上创建一个永久的后台服务吗?使用前台服务。虽然这仍不是“永久”的,但它是迄今为止最为“永久”的。"我也不想通过在状态栏永久显示通知的前台服务来打扰用户" - 你没有太多选择。 - CommonsWare
哦,那很糟糕。我知道永久后台服务可能会让用户感到烦恼,但我真的需要一种方法来创建一个连续的关键字监听器。 - fameman
2个回答

6

很遗憾,在Android 8.0及更高版本中,无法使用后台服务而不显示前台通知。

唯一的可能是将您的应用程序粘贴到Google API上,例如Voice Actions API

据我所知,没有一个好的解决方法,大多数应用程序(如WhatsApp)仍然针对Android API 24进行目标设置。


好的。谢谢您的帮助。 - fameman

1

就我的经验而言,我想分享一下:

在Android 8.0上部分地使用后台服务而不显示前台通知是可能的,我做了一些实验,最终得出了以下结论:

只需创建一个具有IMPORTANCE_NONE的通知通道,通知仍将存在,但不会显示在状态栏中

代码摘录:

NotificationChannel channelService = new NotificationChannel(
    YOUR_SERVICE_CHANNEL_ID,
    YOUR_CHANNEL_HUMAN_READABLE_NAME,
    NotificationManager.IMPORTANCE_NONE);

channelService.setSound(null, null); // let's be quiet : no sound
channelService.setLockscreenVisibility(Notification.VISIBILITY_SECRET); // not on lock screen

// Register the channel with the system; you can't change the importance
// or other notification behaviors after this
// changes needs to uninstall app or clean app data, or rename channel id!
notificationManager.createNotificationChannel(channelService));


这样,当您的应用程序在前台运行时,通知将不会显示。 并不完美的解决方案: 当您的应用程序进入后台(即您打开另一个应用程序)时,“Android系统”应用程序会显示有关“(您的)应用程序在后台运行”的通知。因此,虽然这不是很好,但从我的角度来看比之前要好一点。

1
从Android 8.1开始,当服务调用startForeground方法时,不管通知的重要性如何,系统都会强制将其显示。 - andrei_zaitcev
@andrei_zaitcev 嗯,不完全是这样。如果启动服务的应用程序本身也在前台运行,则我的技巧有效。但是当此应用程序进入后台时,将显示有关“在前台启动服务”的通知。回到应用程序将再次隐藏它。奇怪,但这就是我在我的两个Android 8.1设备上看到的情况。 - Pascal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接