应用程序关闭时,Android AlarmManager无法在某些设备上运行

use*_*701 25 android

我试图每隔半小时IntentService就这样跑AlarmManager setRepeating().我想发送广播,从广播到意向服务.在服务中,将完成一些功能.

但是,最初AlarmManager在app处于关闭状态时不会触发.

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

即使应用程序关闭,我该怎么做才能运行闹钟?

ear*_*jim 32

来自以下文件setRepeating():

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

而且,setRepeating()不适用于Doze.

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

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);
}
Run Code Online (Sandbox Code Playgroud)

每当他们开火时重新安排他们.

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

intent.putExtra(KEY_TRIGGER_TIME, triggerTime);
Run Code Online (Sandbox Code Playgroud)

然后检索此额外内容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
    // ...
}
Run Code Online (Sandbox Code Playgroud)

注意:正如上面评论中提到的@Opiatefuchs,一些制造商(如小米或华为)可能会实施某些节电功能,可以防止警报被触发,并且不能以编程方式绕过.

  • 为什么?尊敬的制造商,您的手机使用/销售量很大是由于我们的努力,而不是您的用户正在使用您的应用程序,因此您使我们难以应对这种情况。如果Google不对制造商施加的这些愚蠢限制采取任何行动,那么不久之后我们便会转向Apple生态系统。 (2认同)

Imr*_*ifi 13

现在,在电池电量消耗的背景下,设备即将出现更多安全性.默认情况下,设备几乎将所有应用程序保持在省电模式 这意味着在某些设备中,当您从应用程序中退出时,您的后台工作(位置,警报管理器)将无法正常工作,在某些设备中,后台任务在电池阈值限制(例如13%)后将无法工作.因此,您需要将此应用程序与此省电模式保持一致,即使在后台运行您的应用程序也能顺利运行.你可以为不同的制造商做这个..

1.对于Xioami

- >转到电池 - >电源 - >应用程序节电 - >您的应用现在选择无限制(对于背景设置)然后选择背景位置选项

- >要在启动后自动启动应用程序 - >转到安全应用程序 - >权限 - >自动启动并检查您的应用程序

2.对于三星

- >> Samsung Smart Manager App用于在3天后停止所有后台工作,如果你没有来到你的应用程序.因此,为您的应用禁用此功能转到应用程序 - >电池 - >详细信息(应用程序省电) - >单击您的应用程序并选择禁用

对于其他设备,应该在设置选项中直接使用相同的电源选项,或者给出一些应用来处理它.

  • 那么,有什么方法可以绕过这个问题,我的意思是即使应用程序正在进行优化?那么,Android 默认闹钟应用程序如何工作? (2认同)

Kei*_*n.k 6

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

其次,在一些具有电池优化功能的设备上,您应该启动一个前台服务,并且完全正常。

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


ser*_*inc 5

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


中兴Blade L110

即使在电池保护程序禁用(设置- >电池- >选项- >电池节电器)并标记为重要的消息的应用程序(设置- >提示与通知- >应用通知- >应用程序的名字- >优先级)这似乎是既不setExact也不setAlarmClock准时触发。