Android AlarmManager no despierta el teléfono

Quiero que se muestre una actividad en un momento determinado. Para esto, estoy usando AlarmManager. Funciona bien cuando el dispositivo está encendido, pero no lo activa si está dormido.

Mi código para configurar la alarma:

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); 

Mi receptor de difusión:

 @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)); } } 

Este código no activa el dispositivo. Sin embargo, cuando lo vuelvo a abrir, se muestran. Necesito hacer que enciendan la pantalla. ¿Puedes ayudarme con este problema?

Tuve un problema similar y la solución fue usar WakeLocker. Eso debería hacerse (preferiblemente como la primera cosa en el receptor), o el dispositivo se despertará cuando se reciba la alarma, pero se dormirá nuevamente antes de context.startActivity(newIntent) ; se llama. (También he observado el comportamiento cuando eso no sucede, por lo que parece ser un poco arbitrario) Así que la respuesta fácil y rápida: Crear una nueva clase llamada WakeLocker con este código fuente:

 package mypackage.test; import android.content.Context; import android.os.PowerManager; public abstract class WakeLocker { private static PowerManager.WakeLock wakeLock; public static void acquire(Context ctx) { if (wakeLock != null) wakeLock.release(); PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, MainActivity.APP_TAG); wakeLock.acquire(); } public static void release() { if (wakeLock != null) wakeLock.release(); wakeLock = null; } } 

y en su receptor llame a WakeLocker.acquire(context); como la 1ra cosa. Extra: también sería estupendo llamar a WakeLocker.release(); una vez que tu alarma haya hecho su trabajo.

Lo más probable es que la alarma esté despertando el dispositivo. Sin embargo, AlarmManager transmisiones de AlarmManager no encenderán la pantalla, y es posible que el dispositivo se vuelva a quedar dormido antes de que comience su actividad.

Tendrá que adquirir WakeLock en onReceive() antes de llamar a startActivity() y liberar ese WakeLock después de que el usuario responda a su actividad.

Para Servicios (tal vez también funciona para la actividad), amplíe su AlarmReceiver de WakefulBroadcastReceiver , adquiere WAKE_LOCK mientras el bash se está procesando.

WakefulBroadcastReceiverhttps://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html

Guía para mantener el dispositivo despierto – https://developer.android.com/training/scheduling/wakelock.html