我的要求是:在GCM消息到达后,设备应该唤醒以显示高优先级通知。设备应该打开屏幕。
目前我正在使用WakeLock来实现这一目标。 newWakeLock()
方法期望锁定级别和标志被传递(作为第一个参数,按位或' d)。
我使用PowerManager.ACQUIRE_CAUSES_WAKEUP
标志,因为它完全符合我的需要。但是,我对锁定级别感到有点沮丧。所以根据docs,我得到了以下选项:
PARTIAL_WAKE_LOCK
- 与ACQUIRE_CAUSES_WAKEUP
不兼容/没有打开屏幕SCREEN_DIM_WAKE_LOCK
- 已弃用SCREEN_BRIGHT_WAKE_LOCK
- 已弃用FULL_WAKE_LOCK
- 已弃用在这种情况下,建议的FLAG_KEEP_SCREEN_ON
完全没用。我最终只是在压制弃用警告:
@SuppressWarnings("deprecation")
PowerManager.WakeLock screenOn = ((PowerManager) c.getSystemService(Context.POWER_SERVICE)).newWakeLock(
PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);
screenOn.acquire();
mNotifyMgr.notify(mNotificationId, mBuilder.build());
screenOn.release();
问题:在描述的情况下是否有一种不推荐的可靠方法来唤醒设备?
编辑我没有要求解决方法来唤醒设备。我的问题是是否可以在不使用弃用API的情况下从后台唤醒设备(没有运行Activity
)
答案 0 :(得分:12)
使用我从我的问题中获得的代码,然后只需完成活动,应该为用户保持正常的时间。相信我,这是唯一的方法,在这个问题上度过了一个愉快的一周。您始终可以使用notitlebar将活动设置为透明,用户永远不会知道。
@Override
protected void onCreate(Bundle savedInstanceState) {
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
finish();
}