Android Oreo的后台服务

15
如何在Android Oreo中继续后台服务而不显示通知点?我使用通知来继续我的后台服务,但我不想显示正在运行的服务的通知。

请提供一些代码并更详细地解释您的问题... - issamux
3个回答

35

如果您在这里仔细阅读了Android Oreo 8.0文档,您可能就不会在此发布问题了。

步骤1:请确保按照下面的代码,将服务作为前台Service启动。

ContextCompat.startForegroundService(mainActivity, new Intent(getContext(), GpsServices.class));
ContextCompat.startForegroundService(mainActivity, new Intent(getContext(), BluetoothService.class));
ContextCompat.startForegroundService(mainActivity, new Intent(getContext(), BackgroundApiService.class));

步骤2:使用通知来显示您的服务正在运行。在ServiceonCreate方法中添加下面的代码行。

@Override
public void onCreate() {
    ...
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        startForeground(NOTIFICATION_ID, notification);
    }
    ...
}

第三步:在服务停止或销毁时删除notification

@Override
public void onDestroy() {
    ...
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
          stopForeground(true); //true will remove notification
    }
    ...
}

这种解决方案的一个问题是,它将一直显示notification,直到您的ServiceAndroid Oreo 8.0上运行的所有设备上运行。

我相信即使应用程序在后台或被杀死状态下,这个解决方案也能工作。

重要提示: 在Android Oreo 8.0中,在后台运行服务时(应用程序在后台或已被杀死),必须显示通知。您不能逃避此规定。因此,建议您按照Android提供的最佳实践对应用程序进行必要的更改,以使其按照最好的方式正常工作。

希望这可以帮助解决您的问题。


8
但是,如果没有那个通知,Facebook和WhatsApp怎么还能运行? - Cecil Paul
3
@CecilPaul,该应用程序暂时被列入白名单,以“处理高优先级的Firebase Cloud Messaging (FCM)消息”。更多信息请参阅此页面:https://developer.android.com/about/versions/oreo/background.html#services - vovahost
2
目前有许多应用程序使用 Oreo 及以上版本,在后台运行服务而没有通知图标。例如大部分安全监控应用、CCTV,甚至包括 Facebook、Instagram、WhatsApp 等最出名的应用程序。我怀疑在 Oreo 及以上版本中使用服务的唯一方式是否为在前台运行。 - nnyerges
1
Facebook、Instagram、WhatsApp和其他大型应用可以获得Google和Apple的特殊权限,以访问我们这些普通用户无法访问的系统服务。 - zeeshan
1
@simon,不幸的是我没有那个信息。你需要直接联系谷歌和苹果询问。然而,今年即2021年,它们都进一步增加了对后台进程和潜在私人信息访问的限制。在我们上一个为加拿大政府开发的项目中,我们不得不放置一条消息,要求用户保持应用程序打开,直到某些操作完成,因为无法处理后台操作。 - zeeshan
显示剩余5条评论

6
这在API版本(26)及更高版本中不可能实现。如果您在没有向用户显示通知的情况下运行服务,Android操作系统会自动关闭它。
如果您的目标是API> = 26,则系统将对您的服务施加限制,除非您的活动处于前台,否则无法在后台运行。一旦您的活动进入后台,系统发现服务在后台运行时将终止该服务(请参见Background service limitations)。
通过使用startForegroundService()方法,即使活动未运行,您也授予了在后台运行服务的权限。一旦服务创建完成,服务必须在五秒内调用其startForeground()方法。

目前有许多应用程序在 Oreo 及更高版本中运行后台服务而没有通知图标。其中大部分为安全监控应用程序、视频监控等,甚至包括 Facebook、Instagram、WhatsApp 等著名应用程序。我怀疑在 Oreo 及更高版本中,使用服务的唯一方式是否是在前台。 - nnyerges
1
Facebook、Instagram、WhatsApp和其他大型应用可以获得Google和Apple的特殊权限,以访问我们这些普通用户无法访问的系统服务。 - zeeshan

1
这段代码对我很有效。首先,你要确保:
1- 在清单文件中定义服务;
2- 在清单文件中定义权限。
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

3- 确保您已经启动了服务。

您的服务应该有一个通知。您需要注意,您的通知必须具有ChannelID!

此页面可以帮助您:

如何在Android中创建自定义通知布局?

Android如何在屏幕上显示通知?

现在将以下代码粘贴到您的服务中

@Override
    public void onCreate() {
        super.onCreate();
            try {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    startForeground(" your Notification ID ", notification);
                }
            } catch (Exception e) {
                Log.e(" Error --->> ", e.getMessage());
            }
    }

在此之后添加以下代码:
@Override
public ComponentName startForegroundService(Intent service) {
    return super.startForegroundService(service);
}

and this:

@Override
public void onDestroy() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        stopForeground(true);
    }
}

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