gestor de notificaciones de Android no funciona con la pantalla está apagada
-
09-10-2019 - |
Pregunta
Tengo un temporizador de cuenta atrás que cuando sale (a cero) se comprueba para ver si la aplicación tiene el foco. Si no se pone en marcha una notificación en la barra de notificaciones. Al hacer clic en la notificación es re-abre la aplicación. Ahora todo esto funciona bien, pero si la pantalla pasa a apagarse, el temporizador sigue y la notificación está disponible en el momento adecuado, pero en realidad nunca vibra o anillos hasta que cumpla la parte posterior de la pantalla en. A continuación, muestra la notificación como lo estaba esperando en una cola o algo así.
¿Cómo consigo para que el gestor de notificaciones en realidad alertar al usuario cuando la pantalla está apagada?
Actualización: Si fijo el temporizador durante 2 minutos, tarda otros 23 minutos para que la notificación en realidad el trabajo. Así lo hace el trabajo pero está en una gran demora!
Código: configuración de modo que el servicio de notificación cuando la aplicación pierde el foco, y cuando el MyCount1 está terminado es comprueba si la aplicación tiene el foco y si no se nota la notificación. Todo esto funciona cuando la retroiluminación de la pantalla está encendida. Una vez que sale no es confiable.
@Override
public void onWindowFocusChanged(boolean hasFocus){
if(hasFocus == false){
mFocusFlag = false;
ns = Context.NOTIFICATION_SERVICE;
mNotificationManager = (NotificationManager) getSystemService(ns);
icon = R.drawable.statusbar;
tickerText = "Check the timer!!!";
when = System.currentTimeMillis();
notification = new Notification(icon, tickerText, when);
context = getApplicationContext();
contentTitle = "Countdown Timer";
contentText = "Click to Check the Timer";
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationIntent = new Intent(this, StartTimer.class);
contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
}else{
mFocusFlag = true;
}
}
public class MyCount1 extends CountDownTimer {
public MyCount1(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
public void onFinish() {
if(mFocusFlag == false){
mNotificationManager.notify(HELLO_ID, notification);
}else{
mVib.vibrate(1000);
}
}
public void onTick(long millisUntilFinished) {
if((millisUntilFinished/1000%60) < 10){
mTime.setText("1st Side = " + millisUntilFinished/60000 + ":0" + (millisUntilFinished / 1000)%60);
}else{
mTime.setText("1st Side = " + millisUntilFinished/60000 + ":" + (millisUntilFinished / 1000)%60);
}
}
}
Solución
Ahora, todo esto funciona bien, pero si la pantalla pasa a apagarse, el temporizador sigue y la notificación está disponible en el momento adecuado, pero en realidad nunca vibra o anillos hasta que cumpla la parte posterior de la pantalla en. A continuación, muestra la notificación como lo estaba esperando en una cola o algo así.
¿Cómo consigo para que el gestor de notificaciones en realidad alertar al usuario cuando la pantalla está apagada?
Cuando la pantalla se apaga, la CPU dejará de funcionar poco después, a menos que algo está sosteniendo un WakeLock
.
Esto significa una de dos cosas:
-
Usted entiende todo esto y está sosteniendo una
WakeLock
. Esto puede o no puede ser una buena idea, desde el punto de vista de lo que los usuarios como con sus dispositivos (por ejemplo, buena duración de la batería). Sea como fuere, puede ser necesario llevar a cabo unaWakeLock
más fuerte, uno que mantiene la pantalla al menos tenue. No he probado la crianza de unNotification
mientras que bajo unWakeLock
, así que no estoy seguro de lo que son las reglas de todo. -
No entiendo todo esto, y por lo tanto está pensando en su contador de tiempo se va cuando, en realidad, el dispositivo se ha quedado dormido y la CPU se ha apagado. Cuando la CPU se vuelve a encender de nuevo, el temporizador de apagado en un instante.
El uso de AlarmManager
le permite hacer eventos basados ??en temporizador que despiertan el dispositivo, y que no requieren que el código sea dando vueltas en la memoria en el ínterin. No tengo idea de lo que estás tratando de hacer aquí (parece bastante extraño de su descripción), pero AlarmManager
puede ser algo vale la pena investigar como un reemplazo para su temporizador.
Otros consejos
Probablemente se apaga cuando el teléfono es despertado por alguna otra aplicación, por ejemplo aplicación de correo electrónico va periódicamente para comprobar si hay nuevos mensajes de correo electrónico. Es necesario configurar su propia alarma de incendio en el tiempo que necesita. http://developer.android.com/reference/android/app/AlarmManager.html
NotificationManager no tiene noción del tiempo. Tiene que ser activado de alguna manera. El problema en su caso es que, si se deja que el sueño de teléfono, que va a hacer precisamente eso. Las alarmas son específicamente existen para que pueda despertar el dispositivo cuando es necesario.