Диспетчер уведомлений Android не работает с выключенным экраном - PullRequest
3 голосов
/ 13 ноября 2010

У меня есть таймер обратного отсчета, который, когда он отключается (обнуляется), проверяет, находится ли приложение в фокусе.Если нет, то запускает уведомление в панели уведомлений.При нажатии на уведомление повторно открывается приложение.Теперь все это работает нормально, но если экран выключается, таймер продолжает работать, и уведомление доступно в нужное время, но на самом деле никогда не вибрирует и не звонит, пока я снова не включу экран.Затем он отображает уведомление, как будто оно ожидало в очереди или что-то в этом роде.

Как получить его, чтобы диспетчер уведомлений фактически предупреждал пользователя, когда экран выключен?

Обновление: Если я установлю таймер на 2 минуты, уведомление действительно будет работать еще 2-3 минуты.Так что это работает, но с огромной задержкой!

Код: Итак, я настраиваю службу уведомлений, когда приложение теряет фокус, и когда MyCount1 завершает, проверяет, имеет ли приложение фокус, и если нет, показываетуведомление.Это все работает, когда включена подсветка экрана.Как только он уходит, он ненадежен.

@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);
            }
        }
       }

Ответы [ 2 ]

2 голосов
/ 13 ноября 2010

Теперь все это работает нормально, но если экран выключается, таймер продолжает работать и уведомление доступно в нужное время, но на самом деле никогда не вибрирует и не звонит, пока я не включу экран.Затем он отображает уведомление, как будто оно ожидало в очереди или что-то в этом роде.

Как получить его, чтобы диспетчер уведомлений фактически предупреждал пользователя, когда экран выключен?

Когда экран выключается, центральный процессор вскоре после этого перестанет работать, если только что-то не удержит WakeLock.

Это означает одно из двух:

  1. Вы понимаете все это и держите WakeLock.Это может быть или не быть хорошей идеей с точки зрения того, что нравится пользователям на их устройствах (например, хорошее время автономной работы).Как бы то ни было, вам может понадобиться более сильный WakeLock, который удерживает экран как минимум тусклым.Я не пытался поднять Notification в то время как под WakeLock, поэтому я не уверен, каковы все правила.

  2. Вы не понимаете всего этого, и поэтому думаетеВаш таймер отключается, когда на самом деле устройство засыпает и процессор выключается.Когда ЦП снова включается, ваш таймер немедленно выключается.

Использование AlarmManager позволяет вам выполнять события на основе таймера, которые активируют устройство и не требуют вашегокод, который будет висеть в памяти в то же время.Я понятия не имею, что вы пытаетесь сделать здесь (кажется довольно странным из вашего описания), но AlarmManager может быть чем-то, что стоит исследовать в качестве замены вашего таймера.

2 голосов
/ 13 ноября 2010

Вероятно, он гаснет, когда телефон просыпается каким-либо другим приложением, например, приложение электронной почты периодически отправляется на проверку новых сообщений.Вы должны установить свой собственный будильник, чтобы сработать в нужное вам время.http://developer.android.com/reference/android/app/AlarmManager.html

NotificationManager не имеет представления о времени.Это должно быть вызвано как-то.Проблема в вашем случае заключается в том, что, если вы дадите телефону спать, он это сделает.Аварийные сигналы специально существуют, поэтому вы можете разбудить устройство, когда вам нужно.

...