Android:检查我的应用是否允许 运行 后台活动

Android: Check if my app is allowed to run background activities

我有一个 运行 秒表服务的应用程序,我 运行 该服务在前台。
我有一个显示计时器的通知,每秒更新一次。
通知在我离开应用程序 30 秒后停止更新,我发现原因是我设备的电池优化:
在我的应用程序的系统设置中,有一个电池优化部分,其中包含一个名为 Allow background activity 的设置,可以打开或关闭。
我发现有 2 个线程 ( and ) 试图回答如何检查设置的状态,它们都建议使用 ActivityManager.isBackgroundRestricted.
对我来说,它没有用。无论设置是打开还是关闭,此函数都返回 false
我如何检查我的应用程序是否允许 运行 后台活动

这是我 phone 中的设置照片(OnePlus 8t OxygenOS 12):

我发现它对我也不起作用。因此,您可以在我的 Git 存储库中看到我的两个 类,我也在 . Also my repo link is here. Here you must see this in my AndroidManifest.xml and this method and this 重写方法中为您提供了这些存储库。

我正在请求忽略电池优化权限,如果启用,它可以正常工作,如果没有启用,则请求该权限。

此外,您可以查看与 question's answer. This相关的结果是结果


如果还是不行,参考这段代码:

String packageName = getPackageName();
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
if (!pm.isIgnoringBatteryOptimizations(packageName)) {
    Toast.makeText(this, "no allowed", Toast.LENGTH_SHORT).show();
    // it is not enabled. Ask the user to do so from the settings.
}else {
    Toast.makeText(this, "allowed", Toast.LENGTH_SHORT).show();
    // good news! It works fine even in the background.
}

并将用户带到此设置的页面,基于 :

Intent notificationIntent = new Intent(Settings.ACTION_APPLICATION_SETTINGS);
PendingIntent pendingIntent = PendingIntent.getActivity(this,0, notificationIntent, PendingIntent.FLAG_IMMUTABLE);
String expandedNotificationText = String.format("Background activity is restricted on this device.\nPlease allow it so we can post an active notification during work sessions.\n\nTo do so, click on the notification to go to\nApp management -> search for %s -> Battery Usage -> enable 'Allow background activity')", getString(R.string.app_name));
notificationBuilder.setContentIntent(pendingIntent)
    .setContentText("Background activity is restricted on this device.")
    .setStyle(new NotificationCompat.BigTextStyle().bigText(expandedNotificationText))