Менеджер уведомлений Android не работает с выключенным экраном

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

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

Обновление: если я установлю таймер на 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 ответа

Решение

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам