Android AlarmManager no despertar teléfono hasta
Quiero que se muestre una actividad en un momento determinado. Para esto, estoy usando AlarmManager. Funciona bien cuando el dispositivo está despierto, pero no lo despierta si está dormido.
Mi código para configurar la alarma:
- Desarrollador de Android - Alarm manager vs service
- Llamada de red en tiempos de espera de alarma
- ¿Cómo guardar la alarma programada después de que la aplicación fue asesinada por Android o asesino de tareas?
- Android AlarmManager - RTC_WAKEUP vs ELAPSED_REALTIME_WAKEUP
- ¿Cómo comprobar si AlarmManager ya tiene un conjunto de alarmas?
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 activar, se muestran. Necesito hacer que enciendan la pantalla. ¿Puedes ayudarme con este problema?
- Ejemplo del Administrador de alarmas
- Aclaración del comportamiento de AlarmManager en Android
- AlarmManager no funciona en varios dispositivos
- ¿Cuál es la definición de dormido para un dispositivo Android?
- Administrador de alarmas de Android trabajando, pero con retraso
- Cómo configurar la alarma en Android?
- Android AlarmManager setExact () no es exacta
- ¿Android AlarmManager controla los cambios de horario de verano?
Tuve un problema similar y la solución fue usar WakeLocker. Eso debe hacerse (preferiblemente como la primera cosa en el receptor), o el dispositivo se despertará cuando se recibe la alarma, pero se quedará dormido de nuevo 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: Hacer 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 llamada del receptor WakeLocker.acquire(context);
Como la primera cosa. Extra: también sería WakeLocker.release();
llamar a WakeLocker.release();
Una vez que su alarma ha hecho su cosa.
Lo más probable es que la alarma esté despertando el dispositivo. Sin embargo, AlarmManager
emisiones de AlarmManager
no encienden la pantalla y es posible que el dispositivo vuelva a dormirse antes de que se inicie la actividad.
Usted necesitará adquirir un WakeLock
en onReceive()
antes de llamar a startActivity()
, y lanzar ese WakeLock
después de que el usuario responda a su actividad.
Para servicios (quizás también funciona para la actividad), extienda su AlarmReceiver de WakefulBroadcastReceiver
, adquiere WAKE_LOCK para usted mientras se procesa la intención.
WakefulBroadcastReceiver
– https://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html
Mantener la guía del dispositivo despierto – https://developer.android.com/training/scheduling/wakelock.html
- Configuración de Android ProGuard para Facebook
- Eclipse se bloquea con un error de límite de sobrecarga de GC excedido