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:
- Android AlarmManager setRepeating no se repite con un intervalo largo
- Android AlarmManager setExact () no es exacta
- Notificación de repetición diaria de Android en el momento específico de un día mediante AlarmManager
- La alarma de Android no funciona
- Alarma programada para repetir cada minuto del reloj android
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?
- Confiabilidad del Administrador de alarmas
- OnReceiver de BroadcastReceiver no llamado, AlarmManager
- ¿Cómo configurar más de una alarma a la vez en android?
- ¿Qué sucede cuando inicio una alarma dos veces?
- Las alarmas set () y setExact () de Android disparan a intervalos incorrectos
- Android cancelar todos los alarmmanager
- Android AlarmManager: ¿hay una manera de cancelar TODAS las alarmas fijadas?
- ¿Cuál es la definición de dormido para un dispositivo Android?
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