android oreo的后台服务

问题描述 投票:8回答:3

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

java android push-notification android-service android-8.0-oreo
3个回答
4
投票

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

如果您要定位API >= 26,系统会对您的服务施加限制,以便在后台运行,除非您的活动位于前台。一旦您的活动转到后台,当系统发现它在后台运行时,服务将终止(请参阅Background service limitations)。

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


24
投票

如果你在here的某个地方正确阅读了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步:使用通知显示您的服务正在运行。在onCreateService方法中添加以下代码行。

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

步骤3:在服务停止或销毁时删除notification

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

这个解决方案的一个问题是它将继续显示notification,直到你的Service在Android Oreo 8.0上运行的所有设备上运行。

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

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

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


0
投票

这段代码对我有用。首先,你要确保:

1-在Manifest中定义服务

2-在Manifest中定义权限

  <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

3-确保您之前已启动过该服务。

您的服务应该有通知。您应该小心,您的通知必须具有ChannelID!

此页面可以帮助您:

How to create a Custom Notification Layout in android?

Android how to show notification on screen

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

@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);
}

还有这个:

@Override
public void onDestroy() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        stopForeground(true);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.