I want an activity to be displayed at a certain time. For this, I am using AlarmManager.
It works fine when the device is awake, but it doesn’t wake it up if it’s asleep.
My code for setting the alarm:
Calendar alarmTime = Calendar.getInstance();
alarmTime.set(Calendar.HOUR_OF_DAY, alarm.hour);
alarmTime.set(Calendar.MINUTE, alarm.minute);
alarmTime.set(Calendar.SECOND, 0);
if (alarmTime.before(now))
alarmTime.add(Calendar.DAY_OF_MONTH, 1);
Intent intent = new Intent(ctxt, AlarmReceiver.class);
intent.putExtra("alarm", alarm);
PendingIntent sender = PendingIntent.getBroadcast(ctxt, alarm.id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime.getTimeInMillis(), sender);
My broadcast receiver:
@Override
public void onReceive(Context context, Intent intent) {
try {
Bundle bundle = intent.getExtras();
final Alarm alarm = (Alarm) bundle.getSerializable("alarm");
Intent newIntent;
if (alarm.type.equals("regular")) {
newIntent = new Intent(context, RegularAlarmActivity.class);
} else if (alarm.type.equals("password")) {
newIntent = new Intent(context, PasswordAlarmActivity.class);
} else if (alarm.type.equals("movement")) {
newIntent = new Intent(context, MovementAlarmActivity.class);
} else {
throw new Exception("Unknown alarm type");
}
newIntent.putExtra("alarm", alarm);
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(newIntent);
} catch (Exception e) {
Toast.makeText(context, "There was an error somewhere, but we still received an alarm", Toast.LENGTH_SHORT).show();
Log.e("AlarmReceiver", Log.getStackTraceString(e));
}
}
This code doesn’t wake the device on. However, when I turn it back again, they are displayed. I need to make them turn the screen on. Can you help me with this problem?
I had a similar problem and the solution was to use WakeLocker. That should be done (preferably as the 1st thing in the receiver), or the device will wake up when the alarm is received, but will fall asleep again before
context.startActivity(newIntent); is called.(I have also observed behavior when that does not happen, so it seems to be a bit arbitrary)
So the easy and quick answer:
Make a new class called WakeLocker with this source code:
and in your receiver call
WakeLocker.acquire(context);as the 1st thing.Extra: it would also be neat to call
WakeLocker.release();once your alarm has done its thing.