【问题标题】:Android AlarmManager not working on some devices when the app is closed关闭应用程序后,Android AlarmManager 在某些设备上不起作用
【发布时间】:2016-09-28 06:33:53
【问题描述】:

我正在尝试每隔半小时从AlarmManager setRepeating() 运行IntentService。我想发送一个广播,从广播到意图服务。在服务中,会做一些功能。

但是,最初AlarmManager 在应用程序处于关闭状态时不会触发。

当我的应用程序正在运行或处于后台状态时,警报工作正常,而当我关闭应用程序时,警报在某些设备中不起作用。

即使应用关闭,我应该怎么做才能运行警报?

【问题讨论】:

  • 请注意,user13 的回答是绝对正确的,但是像华为这样的一些设备也实现了自己的能源管理,您无法以编程方式摆脱它。在我的华为 Ascend Mate 7 中,无论我在做什么(开发者指南对打盹模式的建议),它都不起作用。相反,我必须进行一些设备设置,这只能手动进行......
  • @Opiatefuchs:你能详细说明一下吗? (在我的 LTE 刀片中,即使手动警告和节电设置也无济于事,但也许还有更多?)
  • @serv-inc:嗯,这很难说,有很多不同的实现。我希望这在未来将是独一无二的,或者更好地解释和更用户友好。在华为上,也有自动启动设置。这些设置是我在“电话管理器”中找到的。

标签: android


【解决方案1】:

来自setRepeating()的文档:

从 API 19 开始,所有重复警报都是不准确的。

此外,setRepeating() 不适用于Doze

您应该使用准确的警报(根据设备的 API 级别通过适当的AlarmManager 方法设置):

if (Build.VERSION.SDK_INT >= 23) {
    alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,
            triggerTime, pendingIntent);
} else if (Build.VERSION.SDK_INT >= 19) {
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent);
} else {
    alarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent);
}

并在每次触发时重新安排它们。

对于重新安排,您可以将原始触发时间添加到Intent

intent.putExtra(KEY_TRIGGER_TIME, triggerTime);

然后在onReceive() 中检索此额外内容,将所需的时间间隔添加到其中并使用新值重新安排警报:

@Override
public void onReceive(Context context, Intent intent) {
    long triggerTime = intent
            .getLongExtra(KEY_TRIGGER_TIME, System.currentTimeMillis());

    // adding one day to the current trigger time
    triggerTime += TimeUnit.DAYS.toMillis(1);

    // set a new alarm using the new trigger time
    // ...
}

注意:正如@Opiatefuchs 在上面的评论中提到的,一些制造商(例如小米或华为)可能会实现某些电池保护功能,这些功能可以防止警报被触发并且无法通过编程方式绕过。

【讨论】:

  • 为什么?亲爱的制造商,您的手机大量使用/销售是因为我们的努力,而不是您的用户正在使用您的应用程序,您让我们难以解决这种情况。如果 Google 不对制造商施加的这些愚蠢的限制采取任何行动,那么我们不久就会转向 Apple 生态系统。
  • 即使我在接收器中添加了一个,但循环在警报时启动,为什么?例如,通知一个接一个地重复。
【解决方案2】:

如今,设备在电池功耗方面具有更高的安全性。默认情况下,设备将几乎所有应用程序都保持在省电模式。这意味着在某些设备中,一旦您退出应用程序,您的后台工作(位置、警报管理器)将无法工作。在其他设备中,后台任务在电池阈值限制(如 13%)后将无法工作。因此,您需要让您的应用远离这种省电模式,以便即使在后台也能顺利运行您的应用。在这两个制造商中实现这种行为的方法是:

小米

  • 转到电池 => 电源 => 应用省电模式 => 选择您的应用并选择无限制(对于后台设置),然后选择允许后台位置选项。

  • 要在启动后自动启动您的应用:转到安全应用 => 权限 => 自动启动并检查您的应用。

三星

如果您不使用您的应用程序,三星智能管理器应用程序会在 3 天后停止所有后台工作。所以禁用这个功能的方法是:

  • 转到设置中的电池 => 不受监控的应用程序 => 将您的应用程序添加到白名单。其他一些三星版本可能会在禁用它的位置有所不同,例如电池 => 详细信息 => 选择应用程序并“不优化”。

对于其他设备,应该直接在设置选项中提供相同的电源选项,或者提供一些应用程序来处理它。

【讨论】:

  • 那么,有没有办法绕过这个,我的意思是即使应用程序处于优化状态?那么,android 默认报警应用是如何工作的呢?
【解决方案3】:

首先,android studio 有一个错误。如果您从 android studio 启动应用程序,然后将其从最近的应用程序中滑开,则警报将被删除。因此,在那之后,通过单击启动器图标重新启动您的应用,然后如果您将其滑开,警报仍然存在。

其次,在一些具有电池优化功能的设备上,您应该启动一个前台服务,它工作得很好。

我可以使用这两点让它工作,现在它就像一个魅力。

【讨论】:

  • 我也面临同样的问题。就我而言,我停止了我的应用程序的电池优化,但在关闭应用程序后,它似乎根本无法触发我的广播接收器。在这种情况下,请分享您的想法。我在 Pixel 4XL 操作系统中面临这个问题:11。
  • 谢谢!我注意到了您描述的确切错误行为,这让我发疯了。我认为我的代码有问题,但现在它是有道理的。
【解决方案4】:

完全充电后,以下行为发生了变化。以前,在禁用此应用的节能功能后,它会显示没有激活电池节能等,但只有在充满电后(从非常低的电池状态)设备才能正常运行。因此,更改应用程序的这些设置,然后进行完全充电(可能仅在之前电池电量不足之后)。这可以解决它。


中兴Blade L110

即使禁用了省电模式(设置 -> 电池 -> 选项 -> 省电模式)并且应用程序标记为对消息很重要(设置 -> 提示和通知 -> 应用程序通知 -> 应用程序名称 -> 优先级),它似乎就像setExactsetAlarmClock 都没有按时触发。

【讨论】:

    【解决方案5】:

    联想手机:-

    你需要进入设置->应用程序->选择应用程序->取消选中限制启动

    现在它会在后台作为被杀状态工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      相关资源
      最近更新 更多