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);
            }
        }
       }
¿Fue útil?

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:

  1. 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 una WakeLock más fuerte, uno que mantiene la pantalla al menos tenue. No he probado la crianza de un Notification mientras que bajo un WakeLock, así que no estoy seguro de lo que son las reglas de todo.

  2. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top