Вопрос

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

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

Обновление: если я установлю таймер в течение 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);
            }
        }
       }
Это было полезно?

Решение

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

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

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

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

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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top