当前位置: 首页 > 知识库问答 >
问题:

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

公西嘉玉
2023-03-14

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

共有1个答案

彭高畅
2023-03-14

我发现它对我也不起作用。所以,你可以在我的Git repo中看到我的两个类,我在之前的回答中也提供了这两个类。我的回购链接也在这里。在这里,您必须在我的<代码>AndroidManifest中看到这一点。xml以及这个方法和这个被重写的方法。

在这里,我要求获得“忽略电池优化”权限,如果启用了,它工作正常;如果未启用,则要求获得该权限。

此外,您还可以查看与此问题答案相关的结果。这就是结果

如果不起作用,请参考此代码:

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))      
 类似资料:
  • 我遇到了一个需求,但我无法获得正确的实施方式,因此需要您的帮助。 我想做什么我想根据收到的通知执行以下操作: 当应用程序处于打开状态且处于前台(即用户可见)且我收到通知时,我只需显示一个弹出窗口即可开始我的活动B 我做了什么?我已经达到了第1点和第2点。我想达到第三点。我试过下面的方法 然而,在这两种情况下,点#2和#3都返回true,所以我不能仅区分#3。 我也尝试了下面的每一个活动, 但是,它

  • 问题内容: 我是一名Android开发人员,我想在我的应用程序中编写一条语句。在此语句中,我要检查默认浏览器(Android OS中 问题答案: 添加下面的Helper类: 现在,你可以从以下代码中检查所需的应用程序是否正在运行:

  • 我正在尝试使用JunRAR提取RAR文件。但正如我从这个问题中读到的:OutOfMemoryError当我在Android上解压缩RAR文件时,JunRAR尚未针对Android进行优化。所以,我想做的是检查提取是否成功,然后如果失败则给出错误消息。(因为如果提取不成功,我的应用程序会崩溃)。有人能告诉我如何进行检查吗?我的线程在这里完成: 这是我的Logcat错误:

  • 问题内容: 我需要检查我的应用程序是否在更新时启动,因为我需要创建一个仅在首次安装该应用程序时才出现的视图,以便在更新后再次出现。 问题答案: 您可以将值(例如,当前应用程序版本号)保存到其中,并在每次用户启动应用程序时对其进行检查。 在迅速-2版本看起来是这样的: 在迅速-3版本看起来是这样的:

  • 我想检查某个程序是否在计算机启动时运行,我为此访问了类: 输出确实是,因为该程序实际上是在windows启动时运行的,但是当我通过禁用该程序启动时(它的状态变为),下次我运行上面的代码时,结果仍然是,尽管该程序不再是启动程序的一部分。 这让我得出了一个简单的结论,当windows任务管理器禁用启动程序时,它不会删除注册表项中的项,而是更改了它的另一个值..但是我无法找到那个更改的值。 我希望有人能

  • 据报道,像素设备的Android 11出现了以下崩溃。 致命异常:java.lang.RuntimeException无法启动活动ComponentInfo{}:java.lang.IllegalStateException:不允许启动服务意图{}:应用程序在后台uid UidRecord{} 这只发生在Android 11设备上。谷歌Android 11的服务实现有重大变化吗?