AlarmManager在Android 4.4.2中停止工作(使用SetExact())

时间:2013-12-16 20:29:00

标签: android alarmmanager android-4.4-kitkat

我在我的代码中设置闹钟,以便在特定时间内完成 警报机制适用于SDK<但是在19日,警报没有被解雇 这是我设置闹钟的代码:

public void SetAlarm(Context context, Long executionTime)
{

    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, AlarmReciever.class);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    // Only one alarm can live, so cancel previous.
    am.cancel(pi);
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
        am.set(AlarmManager.RTC_WAKEUP, executionTime, pi);
    } else {
        setAlarmFromKitkat(am, executionTime, pi);
    }
}

由于我使用Service设置闹钟,因此我使用GetApplicationContext()作为上下文。

onReceive()代码:

@Override
public void onReceive(Context context, Intent intent) {
    for (SchedulerListener listener : listeners) {
        listener.fetchAndRebuildNotification();
    }
}

以下是BroadcastReceiver

的声明
<receiver 
        android:name="com.SagiL.myAppName.BroadCastReceivers.AlarmReciever" />

回调在服务中运行一个方法(当警报发生时它仍处于活动状态,注意它不会启动它。)

整个事情是library在我的应用程序中使用,在那里我以相同的方式声明接收器。

有时警报会发射一次,但大多数情况下它根本不发射。

有没有人经历过这样的事情?
我无法相信SDK 19很常见,因为许多应用程序都在使用AlarmManager,如果它们很常见,它们也会破坏。

2 个答案:

答案 0 :(得分:10)

我的申请遇到了类似的问题。我发现使用0广告getBroadcast(...);中的ID并没有很好地发挥作用并导致很多问题。

尝试将id0更改为闹钟的真实身份。

自:

PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

要:

PendingIntent pi = PendingIntent.getBroadcast(context, id, intent, PendingIntent.FLAG_UPDATE_CURRENT);

答案 1 :(得分:7)

这是一个迟到的答案,但可能有所帮助。在Android KitKat 4.4.xx中集成了电池管理器(我的设备:华为Ascend Mate 7)。可以选择在电池管理器中杀死应用程序的后台进程和服务。不知道这些选项是否与德语选项类似,所以请尝试:

  1. 转到设置
  2. 选择节能
  3. 选择详细的耗电量
  4. 选择屏幕关闭:进一步执行
  5. 启用您的应用
  6. 这听起来很简单,但这确实是我的问题。在带有ICS的三星Galaxy S3上,一切都像是一种魅力。但是用Android 4.4.2购买了一台新设备huawei,突然我的应用程序报警无法正常工作。检查系统后,我检测到该选项,启用了我的应用程序,现在一切正常。并非一切都是编程答案:)。

    更新

    由于这个答案已经完成,Android中发生了很多事情。对于每个有类似问题的人:自从更新到Marshmallow后,有两个问题:第一个是如上所述,第二个是打盹模式:

    Optimitzing Doze

    某些设备,如我的华为Ascend Mate 7,使用两种节能方法。因此,做上述内容还不够。此外,您必须将应用列入白名单,并使用新的alarmManager方法setAllowWhileIdle()setExactAndAllowWhileIdle()setAlarmClock()

    可能出现的问题

    通过将您的应用白名单,您必须告诉用户。您可以在启动应用时使用简单信息执行此操作,例如AlertDialog和/或您可以使用ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS intent启动白名单屏幕。但请注意此操作,因为正如一些开发人员所报告的那样,Google可以暂停正在调用此操作的Playstore中的应用程序。

    setAlarmClock也应该有用,但如果你这样做,闹钟图标就在顶部。

    测试

    我已经对新记录的打盹模式进行了一些测试,并发现它通常有效。但是,如果没有白名单,应用程序将进入待机状态并且'alarmManager'不会再触发,也不会使用新方法。我测试了一晚,应用程序在大约一小时内发送到待机状态。在白天的正常情况下,用户处于活动状态并且经常移动他的设备,它可以在没有白名单的情况下工作。