android oreo的后台服务

fai*_*eji 12 java android push-notification android-service android-8.0-oreo

如何在没有显示通知点的情况下在android Oreo中继续后台服务?我使用通知继续我的后台服务,但我不想显示运行服务的通知.

Amr*_*dri 26

如果您已经在这里的某处正确阅读了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));
Run Code Online (Sandbox Code Playgroud)

第2步:使用通知显示您的服务正在运行.在onCreate方法中添加以下代码行Service.

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

步骤3:删除notification服务停止或销毁的时间.

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

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

我确信即使应用程序处于后台或处于kill状态,此解决方案也能正常工作.

重要说明:显示在背景中运行服务的通知(背景中的应用程序或杀死状态)在ANDROID OREO 8.0中是强制性的.你不能用它跑.因此,我们建议您根据ANDROID所做的最佳实践,对您的应用程序进行必要的更改以使其正常工作.

我希望这可能有助于解决您的问题.

  • 但是Fb和whatsapp如何在没有该通知的情况下仍然有效? (5认同)
  • @CecilPaul 因为该应用程序暂时被列入“处理高优先级 Firebase 云消息传递 (FCM) 消息”的白名单。在此页面上阅读更多 https://developer.android.com/about/versions/oreo/background.html#services (3认同)
  • 目前,有许多应用程序在后台运行服务,但没有使用 Oreo 及更高版本的通知图标。首先,大多数安全监控应用程序,cctv。即使是最广为人知的 facebook、instagram、whatsapp 等;我怀疑在 Oreo 及更高版本中使用服务的唯一方法是在前台。 (2认同)

Abd*_*man 6

这在这个API version (26)和更高版本中是不可能的。如果您在不向用户显示通知的情况下运行它,Android 操作系统会自动关闭您的服务。

如果您的目标API >= 26是系统将限制您的服务在后台运行,除非您的活动在前台。一旦您的活动进入后台,当系统发现它在后台运行时,该服务将终止(请参阅后台服务限制)。

通过使用startForegroundService()方法,即使活动未运行,您也可以授予在后台运行服务的权限。还必须在创建服务后,服务必须调用其startForeground()在五秒内方法。