Android打盹模式

时间:2016-05-28 19:38:13

标签: android android-studio alarmmanager

在我的应用程序中,我将使用警报通知用户事件,问题是 在Android版本6.x-上 警报在确切时间的相同分钟后发出 这仅在设备进入睡眠模式时。

我试图在闹钟之前唤醒设备,但无济于事。

任何人都可以帮助我吗?这是我的代码

设置闹钟

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, alarmCalendar.getTimeInMillis(), pendingIntent);
        if (minutesBefore > 0) {
            beforeCalendar.add(Calendar.MINUTE, -minutesBefore);
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, beforeCalendar.getTimeInMillis(), beforePendingIntent);
        }
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, alarmCalendar.getTimeInMillis(), pendingIntent);
        if (minutesBefore > 0) {
            beforeCalendar.add(Calendar.MINUTE, -minutesBefore);
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, beforeCalendar.getTimeInMillis(), beforePendingIntent);
        }
    } else {
        alarmManager.set(AlarmManager.RTC_WAKEUP, alarmCalendar.getTimeInMillis(), pendingIntent);

        if (minutesBefore > 0) {
            beforeCalendar.add(Calendar.MINUTE, -minutesBefore);
            alarmManager.set(AlarmManager.RTC_WAKEUP, beforeCalendar.getTimeInMillis(), beforePendingIntent);
        }
    }

弱锁定

  

当我收到broadcastreceiver的警报时,我试着唤醒设备   来自此代码的打盹模式

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        //Object flags;

            wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Alarm_WakeLock");

        wl.acquire();

但警报仍在同一分钟后发出!!

2 个答案:

答案 0 :(得分:1)

当电话未使用一段时间时,实施打盹模式以节省电池电量。它通过延迟像AlarmManager这样的操作来实现。

如果您确实需要在准确时间内触发警报,请使用[setExactAndAllowWhileIdle()](https://developer.android.com/reference/android/app/AlarmManager.html#setExactAndAllowWhileIdle(int,long,android.app.PendingIntent))。

docs说:

  

如果您需要设置在Doze中触发的警报,请使用setAndAllowWhileIdle()或setExactAndAllowWhileIdle()。

答案 1 :(得分:0)

docs开始,看起来setExactAndAllowWhileIdle即使在打瞌睡期间也会触发,所以这对你有用,但你可以试试setAlarmClock。

  

使用setAlarmClock()设置的警报继续正常启动 - 系统在警报触发前不久退出Doze。

所以你可以使用它。但它旨在用于用户认为的闹钟 - 手机将提醒用户的预定时间(而不仅仅是日历事件)。图标甚至在状态栏中显示为物理闹钟面,许多锁屏也会通知用户下一次警报的安排时间。

REF https://www.bignerdranch.com/blog/diving-into-doze-mode-for-developers/