在AlarmManager启动的活动中唤醒设备

时间:2014-03-23 16:50:50

标签: android alarmmanager powermanager

我有一个应用程序,可以在给定时间启动全屏活动(基于用户设置)。我需要在发生这种情况时唤醒设备,以便用户可以看到活动。 我使用AlarmManager来安排这些事件,它似乎工作正常(我没有注意到任何错过的警报事件),但是,在某些设备上,它发生屏幕无法打开。在这种情况下,如果我手动唤醒设备,那么我可以看到我的活动在那里并且它正在运行它只是没有打开屏幕。 我不能每次都重现它,有时候它会起作用,有时它却不起作用。有些设备一直都能很好地工作。我可以在不同的操作系统版本上看到这个问题,所以它不是特定于我猜的SDK。

我如何设置AlarmManager的示例:

Intent myIntent = new Intent(context, AlarmActivity.class);
myIntent.putExtras(extras);
PendingIntent pIntent = PendingIntent.getActivity(context, ID, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarm = (AlarmManager)
context.getSystemService(Context.ALARM_SERVICE); 
alarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInMillis, pIntent);

以下是我在AlarmActivity的onCreate中使用的内容:

PowerManager pm;
WakeLock wakeLock;
WakeLock cpuWake;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    pm = (PowerManager) getSystemService(POWER_SERVICE);
    cpuWake = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
    cpuWake.acquire();
    wakeLock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP
            | PowerManager.FULL_WAKE_LOCK, TAG);
    if (!wakeLock.isHeld()) {
        wakeLock.acquire();
    } 

    final Window win = getWindow();
    win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
            | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
            | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_FULLSCREEN);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.layout);
//rest of the code

注意:我在没有PARTIAL_WAKE_LOCK的情况下尝试了它,结果是相同的行为。

知道我做错了什么?

我很感激任何评论,因为这个问题让我感到头疼。

谢谢。

1 个答案:

答案 0 :(得分:0)

好吧,为了加快调试过程,我决定使用我能够用来重现这个问题的一个测试设备。经过多次尝试,我意识到即使是股票时钟的行为方式也是如此,所以基本上它否定了我所有的尝试。无论如何,我能够在另一台设备上重现它(不太可能)。

我最终使用的(基于其他SO答案)是一个BroadcastReciever,用于我的警报并以静态方式使用唤醒锁(在接收广播和发布活动时获取)。到目前为止似乎有效。

我在服务中遇到另一个唤醒问题,因为我最终使用了wakefulbroadcastreceiver和startwakefulservice(为此它足以唤醒cpu)。