Question

J'ai un compte à rebours que quand il se déclenche (à zéro), il vérifie si l'application a le focus. Dans le cas contraire, il lance une notification dans la barre de notification. Lorsque vous cliquez sur la notification est réouvre l'application. Maintenant, tout cela fonctionne bien, mais si l'écran arrive à partir, la minuterie continue à aller et la notification est disponible au bon moment, mais jamais réellement sonne ou vibre jusqu'à ce que je tourne le dos d'écran. Ensuite, il affiche la notification comme il a été en attente dans une file d'attente ou quelque chose.

Comment puis-je obtenir pour que le gestionnaire de notification avertit l'utilisateur en fait lorsque l'écran est éteint?

Mise à jour: Si je mets la minuterie pendant 2 minutes, il faut encore 2-3 minutes pour la notification à fait le travail. Donc, il ne fonctionne pas, mais il est sur un retard énorme!

code: Donc, la configuration I le service de notification lorsque l'application perd le focus, et quand est vérifie la MyCount1 est terminée si l'application a le focus et sinon il montre la notification. Tout cela fonctionne lorsque le rétroéclairage de l'écran est allumé. Une fois éteint, il est peu fiable.

@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);
            }
        }
       }
Était-ce utile?

La solution

  

Maintenant, tout cela fonctionne très bien, mais si l'écran arrive à partir, la minuterie continue à aller et la notification est disponible au bon moment, mais jamais réellement sonne ou vibre jusqu'à ce que je tourne le dos d'écran. Ensuite, il affiche la notification comme il a été en attente dans une file d'attente ou quelque chose.

     

Comment puis-je obtenir pour que le gestionnaire de notification avertit l'utilisateur en fait lorsque l'écran est éteint?

Lorsque l'écran est éteint, la CPU cessera de fonctionner peu après, à moins que quelque chose tient un WakeLock.

Ce signifie deux choses:

  1. Vous comprenez tout cela et tenez un WakeLock. Cela peut ou peut ne pas être une bonne idée, du point de vue de ce que les utilisateurs comme avec leurs appareils (par exemple, une bonne autonomie de la batterie). Quoi qu'il en soit, vous devrez peut-être tenir une WakeLock plus forte, qui maintient l'écran au moins faible. Je ne l'ai pas essayé élever un Notification alors sous un WakeLock, donc je ne suis pas certain que les règles sont.

  2. Tu ne comprends pas tout cela, et sont donc penser que votre minuterie va quand, en réalité, l'appareil est tombé endormi et le CPU est désactivé. Lorsque les tours CPU rallumé, votre minuterie sera immédiatement.

Utilisation AlarmManager vous permet de faire des événements en fonction timer qui éveillent l'appareil et ne nécessitent pas votre code à traîner en mémoire dans l'intervalle. Je ne sais pas ce que vous essayez de faire ici (semble assez bizarre de votre description), mais AlarmManager peut être utile de quelque chose d'instruction en remplacement de votre minuterie.

Autres conseils

Il va probablement lorsque le téléphone est réveillé par une autre application, par exemple l'application de messagerie passe périodiquement pour vérifier les nouveaux e-mails. Vous devez définir votre propre alarme incendie au moment où vous avez besoin. http://developer.android.com/reference/android/app/AlarmManager.html

NotificationManager n'a pas la notion du temps. Il doit être déclenché en quelque sorte. Le problème dans votre cas est que, si vous laissez le sommeil de téléphone, il fera tout cela. Les alarmes sont existent spécifiquement pour vous permettre de réveiller l'appareil lorsque vous avez besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top