2

我正在创建一个闹钟。要设置日期和时间,我使用AlarmManager

AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);      
PendingIntent pi = PendingIntent.getBroadcast(context, id, intent,  PendingIntent.FLAG_UPDATE_CURRENT);
                    am.set(AlarmManager.RTC_WAKEUP, note.getAlarmTime(), pi);

在我BroadcastReceiver的 in 方法中,onReceive我开始了新的活动(类似于信息对话和播放音乐)并用于解锁屏幕:

PowerManager pm;
PowerManager.WakeLock wakeLock;
KeyguardManager.KeyguardLock myLock;

KeyguardManager myKeyGuard = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
    isLocked = myKeyGuard.inKeyguardRestrictedInputMode();

myLock = myKeyGuard.newKeyguardLock(KEYGUARD_SERVICE);

    if (isLocked) {
        myLock.disableKeyguard();
    }

    pm = (PowerManager) getApplicationContext()
            .getSystemService(Context.POWER_SERVICE);
    wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
            | PowerManager.ACQUIRE_CAUSES_WAKEUP
            | PowerManager.ON_AFTER_RELEASE, "MyWakeLock");
    wakeLock.acquire();

这一切都很好,但在棒棒糖设备上,我注意到警报并不总是有效,尤其是当设备被阻止超过 20 分钟时。会是什么呢?也许是一些重置指定时间的功能,或者我需要一种不同的方法来在 android Lollipop 上以编程方式解锁屏幕?

4

1 回答 1

2

AlarmManager.setExact()从 Android 19 开始,如果您想要精确的计时而不是AlarmManager.set()像您的代码那样,您应该使用新方法。AlarmManager API 文档中提到了这一点:

注意:从 API 19 (KITKAT) 开始,警报传递是不精确的:操作系统将切换警报以最大程度地减少唤醒和电池使用。有新的 API 来支持需要严格交付保证的应用程序;参见 setWindow(int, long, long, PendingIntent) 和 setExact(int, long, PendingIntent)。targetSdkVersion 早于 API 19 的应用程序将继续看到以前的行为,即所有警报都在请求时准确传递。

于 2015-07-12T12:13:51.320 回答