AlarmManager不会唤醒设备

时间:2014-09-15 14:13:00

标签: android alarmmanager

我设置了这样的警报:

registerReceiver(wakeUpReceiver, new IntentFilter("com.example.yay"));
pi = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent("com.example.yay"), 0);
am = (AlarmManager)(getSystemService(Context.ALARM_SERVICE));

if (android.os.Build.VERSION.SDK_INT>=android.os.Build.VERSION_CODES.KITKAT) {
    am.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+30*1000, pi);
} else {
    am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+30*1000, pi);
}

如果设备处于唤醒状态,它会起作用,但是如果我关闭屏幕,它就不会打开屏幕(但会唤醒wakeUpReceiver的onReceive())

我需要在清单中放入什么? AlarmManager文档似乎没有提及任何与权限或意图过滤器或类似内容相关的内容。也许我只是像往常一样误解文档?

是的,我已经阅读了所有其他类似的问题,但他们没有帮助。

2 个答案:

答案 0 :(得分:0)

您可以使用Wakelock来实现这一目标:

不同级别的唤醒锁定:

  

FULL_WAKE_LOCK - 保持屏幕全亮度,键盘   背光照亮,CPU运行。 SCREEN_BRIGHT_WAKE_LOCK -   保持屏幕全亮度和CPU运行。   SCREEN_DIM_WAKE_LOCK - 保持屏幕开启但让它变暗和CPU   运行。 PARTIAL_WAKE_LOCK - 保持CPU运行

Wakelock的Android权限:

由于唤醒锁定会对电池寿命产生巨大影响,因此您的应用程序需要请求WAKE_LOCK权限才能创建它们。      

制作唤醒锁 要创建唤醒锁定,请按照以下步骤在Power manger上调用newWakeLock:

PowerManager.WakeLock wakeLock ;
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
 wakeLock = pm.newWakeLock( PowerManager.SCREEN_DIM_WAKE_LOCK, "My wakelook");

释放唤醒锁定

wakeLock.release();

释放唤醒锁非常重要,否则会耗尽电池。

答案 1 :(得分:0)

如上所述,使用wakelock在onReceive()中创建WakeLock。

或者我建议您使用WakefulBroadcastReceiver。 这将确保您的电话在服务期间处于清醒状态。

WakefulBroadcastReceiver是第二件事的最佳选择,关于唤醒锁 - 你可以在google上查看一些示例,说明如何将警报管理器与唤醒锁使用。 Ofc,你的服务可以完成它的工作,但有时睡眠可能会出现,所以我建议你实施它,即使你的测试没有显示问题,更好的是保持安全。

你确定onReceive()被调用了吗?创建一些日志并进行一些测试。现在可能有2个问题:或者睡觉没有呼叫onReceive()(这里检查手机上的电源管理选项,我手机上的“Stamina”有问题,这阻止了我的闹钟)或者你的手机正在睡着了在你做你的工作之前(然后唤醒锁/ WakefulBroadcastReceiver)。

此外,AlarmManager不会“点亮”你的屏幕,只有CPU。

要打开屏幕,请使用getWindow()。addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 或者android:keepScreenOn =布局中的“true”。

另一个用户SCREEN_DIM_WAKE_LOCK建议的方法在API级别17中已弃用,请记住这一点!

更多: https://developer.android.com/training/scheduling/wakelock.html