Frage

ich einen Countdown-Timer haben, dass, wenn es losgeht (auf Null) es überprüft, ob die App Fokus hat. Wenn nicht, es startet eine Benachrichtigung in der Benachrichtigungsleiste. Wenn Sie auf die Meldung klicken ist die App wieder öffnet. Nun all dies funktioniert gut, aber wenn der Bildschirm gehen geschieht, wird der Timer läuft weiter und die Benachrichtigung zur richtigen Zeit zur Verfügung, aber nie tatsächlich vibriert oder klingelt, bis ich den Bildschirm wieder einzuschalten. Dann zeigt es die Meldung, wie es in einer Warteschlange oder etwas zu warten.

Wie ich es bekomme, so dass der Benachrichtigungsmanager tatsächlich den Benutzer alarmiert, wenn der Bildschirm ausgeschaltet ist?

Update: Wenn ich den Timer für 2 Minuten eingestellt, dauert es weitere 2-3 Minuten für die Anmeldung tatsächlich Arbeit. Also es funktioniert, aber es ist auf einer großen Verzögerung!

Code: Also ich Setup die Benachrichtigungsdienst, wenn die Anwendung den Fokus verliert, und wenn der MyCount1 beendet ist überprüft, ob die App Fokus hat und wenn nicht zeigt es die Meldung. Das alles funktioniert, wenn die Bildschirm-Hintergrundbeleuchtung eingeschaltet ist. Sobald es losgeht es unzuverlässig ist.

@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);
            }
        }
       }
War es hilfreich?

Lösung

Nun all dies funktioniert gut, aber wenn der Bildschirm gehen geschieht, wird der Timer läuft weiter und die Benachrichtigung zur richtigen Zeit zur Verfügung, aber nie tatsächlich vibriert oder klingelt, bis ich den Bildschirm wieder einzuschalten. Dann zeigt es die Meldung, wie es in einer Warteschlange oder etwas zu warten.

Wie ich es bekomme, so dass der Benachrichtigungsmanager tatsächlich den Benutzer alarmiert, wenn der Bildschirm ausgeschaltet ist?

Wenn der Bildschirm ausgeschaltet wird, wird die CPU kurz danach nicht mehr ausgeführt, es sei denn, etwas einen WakeLock hält.

Dieses Mittel eines von zwei Dingen:

  1. Sie verstehen alles und sind eine WakeLock halten. Dies kann oder kann nicht eine gute Idee, vom Standpunkt der, was die Nutzer wie mit ihren Geräten (zum Beispiel gute Akkulaufzeit) sein. Sei es wie es sei, Sie eine stärkere WakeLock halten müssen kann, eine, die den Bildschirm mindestens dim hält. Ich habe nicht versucht, ein Notification während unter einem WakeLock Erhöhung, so dass ich bin mir nicht sicher, was die Regeln alle sind.

  2. Sie haben nicht alle verstehen, und deshalb denken Ihre Timer gehen wird, wenn in Wirklichkeit hat das Gerät entschlafen und die CPU abgeschaltet hat. Wenn die CPU schaltet wieder zurück, Ihre Timer wird sofort deaktiviert.

AlarmManager verwenden, können Sie Timer-basierten Ereignissen tun, die das Gerät aufwachen, und erfordern nicht den Code in der Zwischenzeit im Speicher rumhängen werden. Ich habe keine Ahnung, was Sie versuchen, hier zu tun (scheint eher bizarr aus Ihrer Beschreibung), aber AlarmManager kann als Ersatz für die Timer-Untersuchung etwas wert sein.

Andere Tipps

Es geht wahrscheinlich aus, wenn das Telefon von einer anderen Anwendung aufgeweckt wird, zum Beispiel E-Mail-Anwendung geht regelmäßig auf neue E-Mails zu überprüfen. Sie müssen Ihre eigenen Alarm Feuer zu dem Zeitpunkt einstellen Sie benötigen. http://developer.android.com/reference/android/app/AlarmManager.html

NotificationManager haben keine Vorstellung von Zeit. Es muss irgendwie ausgelöst werden. Das Problem in Ihrem Fall ist, dass, wenn Sie das Telefon schlafen lassen, wird es tun genau das. Alarme sind speziell vorhanden, so dass Sie das Gerät aufwachen kann, wenn es nötig ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top