AlarmManager从睡眠状态唤醒活动,但活动不受欢迎

时间:2013-03-29 15:13:16

标签: android alarmmanager wakelock android-wake-lock

我有一个AlarmManager设置闹钟:

Intent intent = new Intent(mContext, AwakeActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent pendingIntent = PendingIntent.getActivity(mContext, PENDING_INTENT_ID, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(mContext.ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + futureTime, pendingIntent);

并且警报按预期工作。当闹钟响起时,我打开了AwakeActivity。这也按预期工作。在AwakeActivity中我有:

@Override
public void onCreate(Bundle savedInstanceState)
{
    // main
    super.onCreate(savedInstanceState);

    // inflate
    setContentView(R.layout.awake);

    Window window = this.getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); //relates to IInputConnectionWrapper issue - but not cause of instant close of app
    window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
    window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
}

这是我的清单定义:

<activity 
        android:name=".AwakeActivity"
        android:label="@string/activityAwake"
        android:configChanges="keyboardHidden|orientation"
        android:theme="@android:style/Theme.NoTitleBar"
        android:screenOrientation="portrait"
        android:launchMode="singleInstance"
        android:noHistory="true"
    >
    </activity>

我遇到的问题是,当AwakeActivity启动时,它不会保持打开状态。它立即关闭。但是......这只会在手机处于睡眠模式时发生,如果我打开屏幕并通过闹钟打开AwakeActivity - 一切都很好。

另一个但是......这是在我运行2.3.4的Droid X而不是我的Galaxy Nexus 4.2.2上发生的。我已经在这一段时间了,感觉好像我做得很好。

我在这里缺少什么?有什么想法吗?

1 个答案:

答案 0 :(得分:3)

我自己遇到了类似的问题。在某些设备上,设备会唤醒,而在其他设备上,活动将关闭。您是否尝试使用WakeLock来查看是​​否发生了同样的事情?

因此声明一个全局唤醒锁变量:

PowerManager.WakeLock wakelock;

在onCreate方法中执行以下操作:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakelock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
                | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_BRIGHT_WAKE_LOCK
                | PowerManager.ON_AFTER_RELEASE, "tag");
wakelock.acquire();

现在你只需要释放唤醒锁,就像你的onPause方法一样:

@Override
protected void onPause() {
    super.onPause();      
    wakelock.release();
}

您还需要在清单文件中包含此内容:

<uses-permission android:name="android.permission.WAKE_LOCK"/>