繁体   English   中英

Android Oreo的后台服务

[英]Background service for android oreo

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

如果您可以在此处的某处正确阅读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:使用通知显示您的服务正在运行。 Service onCreate方法中添加以下代码行。

@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直到您的ServiceAndroid Oreo 8.0上运行的所有设备上运行为止。

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

重要说明:在ANDROID OREO 8.0中必须显示在后台运行服务的通知(在后台或处于杀毒状态的APP)。 不能逃避它。 因此, 建议您在应用中进行必要的更改,以使其按照ANDROID遵循或要求的最佳做法正确地工作。

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

在此API version (26)及更高API version (26)这是不可能的。 Android OS在运行服务时会自动关闭它,而不会向用户显示通知。

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

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

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

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

和这个:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM