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

Sag*_*Low 7 android alarmmanager android-4.4-kitkat

我在我的代码中设置了警报,以便在特定时间内启动.
警报机制在SDK <19时运行良好,但在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

因为我使用ServiceGetApplicationContext()用作上下文来设置闹钟.

onReceive()代码:

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

这是以下声明BroadcastReceiver:

<receiver 
        android:name="com.SagiL.myAppName.BroadCastReceivers.AlarmReciever" />
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Ass*_*iel 10

我的申请遇到了类似的问题.我发现使用0广告id getBroadcast(...);并不能很好地工作并造成很多问题.

尝试将idfrom 0更改为警报的真实ID.

从:

PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Run Code Online (Sandbox Code Playgroud)

至:

PendingIntent pi = PendingIntent.getBroadcast(context, id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Run Code Online (Sandbox Code Playgroud)

  • 事实是使用0并使用任何其他数字确实有所不同.它没有在任何地方记录,但根据我的经验,使用0作为请求代码几乎从来不是一个好主意. (4认同)

Opi*_*chs 7

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

  1. 前往设置
  2. 选择节省能源
  3. 选择详细的功耗
  4. 选择屏幕关闭:进一步执行
  5. 启用您的应用

这听起来很简单,但这确实是我的问题.在带有ICS的三星Galaxy S3上,一切都像魅力一样.但是用Android 4.4.2买了一台新设备huawei,突然我的应用程序报警无法正常工作.检查系统后,我检测到该选项,启用了我的应用程序,现在一切正常.并非一切都是编程答案:).

UPDATE

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

Optimitzing打瞌睡

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

可能的问题

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

setAlarmClock也应该有效,但如果你这样做,闹钟图标就在上方.

测试

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