有时使用AlarmManager不会触发警报

时间:2018-01-04 14:44:44

标签: android alarmmanager android-alarms

我有一个提醒应用程序,通知用户特定任务。一切都按预期工作,但有时警报不会被触发。近100名用户报告了此问题。我怀疑当设备处于睡眠模式时,不会触发警报。我面临这个问题将近1年,我还没有找到任何解决方案。

这是警报的安排方式:

public void schedule(Context context, long nextTrigger, Intent intent) {
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, REQ_CODE_ALARM, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    int ALARM_TYPE = AlarmManager.RTC_WAKEUP;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        alarmManager.setExactAndAllowWhileIdle(ALARM_TYPE, nextTrigger, pendingIntent);
    }
    else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        alarmManager.setExact(ALARM_TYPE, nextTrigger, pendingIntent);
    }
    else {
        alarmManager.set(ALARM_TYPE, nextTrigger, pendingIntent);
    }
}

这是来自未决意图的广播接收器:

public class ReminderAlarm extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = null;
        if (pm != null) {
            wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, APP_NAME);
            if (wl != null)
                wl.acquire(10000L);
        }

        Log.log("Reminder alarm received");

        ReminderJobIntentService.enqueueWork(context, ReminderJobIntentService.class, JOB_ID_REMINDER_ALARM, intent);

        if (wl != null)
            wl.release();
    }
}

这是从广播中排队的工作意向服务:

public class ReminderJobIntentService extends JobIntentService {

    @Override
    protected void onHandleWork(@NonNull Intent intent) {
        Log.log("Reminder job intent service");

        // Creates a notification on the UI
        Utils.createNotification();

        // Schedule the next task (alarm). Actually it's schedule(context, long, intent) but it calculates the next trigger. That's it
        Scheduler.getInstance().scheduleNext();
    }
}
  1. 我有记录正确安排警报的日志。收到广播时(触发警报时)我也记录了这个。如果没有广播日志,则表示未触发警报。
  2. 警报安排在Boot Complete
  3. 我尝试使用不同的Android设备和版本多次重现此问题,但我无法重现它。我甚至试图将设备放在Doze ModeBattery Unpluged中,但没有运气。警报被触发。我将设备保持了近3天的不动状态,延迟4分钟触发警报(因为Android操作系统正在对警报进行批处理)。
  4. 当用户抱怨未收到提醒时,通常我会将其重定向到“设置 - >电池 - >忽略应用的电池优化”。但有时这不能解决问题。
  5. 我注意到有人抱怨这个是使用三星设备:S6,S7,S8型号与Android 6,7。(也许是因为45%的用户使用这种类型的设备?)

    您是否曾遇到过这个具体问题?我错过了什么吗?三星型号是否在后台查杀应用程序?也许某些第三方应用程序会杀死这些应用程序?

2 个答案:

答案 0 :(得分:0)

我在构建应用程序以获取每日通知时遇到了类似的问题。问题不在于代码,而是在Android Kitkat及以上版本中处理警报的方式。警报现已经过优化,可最大限度地减少唤醒和电池使用。所以他们可能会在不同时间开火或根本不开火。您可以在此处查看更多信息:

AlarmManager not working properly

答案 1 :(得分:0)

你知道为什么nigth警报应用程序通常运行良好吗? ...因为手机通常连接到充电器,然后它不会进入睡眠模式

我的建议: 启动一个前台服务,这是一个服务而不是调用startForeground()并显示一个不可忽略的通知,你也必须获得一个部分的唤醒锁。

这样设备将不会进入深度睡眠状态,并且应该正确触发警报......但代价是耗尽电池