Уведомление устройства блокировки Android не звучит - PullRequest
3 голосов
/ 22 ноября 2011

Я разработал приложение, которое запускает пользовательскую службу, которая запускает обратный отсчет времени.Служба запускает уведомление о старте таймера и прочее о финише.Во время тестов я вижу проблему с уведомлением и экраном блокировки.Я описываю тесты, которые я провел:

1) Если я запускаю приложение и не позволяю телефону выключиться или заблокироваться, служба воспроизводит звук уведомления правильно, как если бы основное приложение (действие) находилось впереди какне.В обеих ситуациях служба прекрасно запускает уведомления.

2) Если я заблокировал телефон, а приложение было заблокировано до блокировки, служба воспроизводит звук уведомления правильно.

3) Вот мойпроблема: если я заблокировал телефон и приложение не было спереди перед блокировкой, уведомление не звучит, но служба выглядит как запущенная, потому что когда я нажимаю кнопку «вкл» в моем телефоне, то сразу после включения экрана, он воспроизводит уведомление (звук и значок) прямо на экране блокировки, прежде чем я могу разблокировать телефон.

Мой код в службе отменяет предыдущее уведомление, это код, который запускает уведомление после окончания таймера:

private void notificacion_fin() {
    NotificationManager notificationManager = 
            (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    notificationManager.cancel(0);
    Notification not = new Notification();
    // Ponemos la nueva notificacion de que hemos acabado
    SharedPreferences preferences = this.getSharedPreferences("com.fsp.mypref", 0);
    String not_sound = preferences.getString("notification_tone","");
    not.audioStreamType = AudioManager.STREAM_NOTIFICATION;
    not.sound = Uri.parse(not_sound);
    if (tipo_cronometro == 1) {
        not.icon = R.drawable.ic_stat_notify_time;
        not.tickerText = "Task has finished";
    } else {
        not.icon = R.drawable.ic_stat_notify_complete;
        not.tickerText = "Type 2 task has finished";
    }
    not.when = System.currentTimeMillis();
    not.defaults |= Notification.DEFAULT_VIBRATE;
    not.vibrate = new long[] {300,300,300,300,300};
    not.flags |= Notification.FLAG_AUTO_CANCEL;
    Intent notificationIntent = new Intent(this, MyActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
    not.setLatestEventInfo(this, "My app", not.tickerText, contentIntent);
    notificationManager.notify(0, not); 
    notificacion = true;
}

Я подозреваю, что моя проблема может быть связана с контекстом, может быть?Кто-нибудь знает, что может происходить?почему в моем 3-м тесте не работает правильно?
Любая помощь будет приветствоваться.
Заранее спасибо.

PS: Когда я говорю звук уведомления, я имею в виду звук + значок

1 Ответ

2 голосов
/ 22 ноября 2011

Что ж, всякий раз, когда вы блокируете экран (обычно в течение минуты или двух), телефон переходит в спящий режим. У вас есть три варианта, два из которых лучше.

  1. Используйте startForeground на вашем сервисе. Таким образом, это будет по сути впереди. Но это все еще будет зависеть от режима сна.
  2. Использовать WAKE_LOCK - это мой любимый вариант, но для него требуется дополнительное разрешение в приложении, которое невежественные пользователи обычно не понимают.
  3. Установка будильника с помощью Alarm Manager - Так как воспроизведение уведомления не занимает много времени, это, вероятно, лучший способ сделать это, а затем вы отправите широковещательную рассылку, когда тревога вызовет, что приведет к BroadcastReceiver, чтобы сделать звук уведомления.

Если вам нужен визуальный таймер обратного отсчета, также запустите службу, но не полагайтесь на службу, чтобы бодрствовать без WAKE_LOCK. Службы также могут быть уничтожены, если у пользователя плохой телефон или он пытается использовать приложение, которое использует слишком много оперативной памяти - мой телефон, вероятно, убил бы его, потому что мой телефон отстой.

Мне нравятся пробуждения, но лучше всего это сделать с помощью Alarm Manager.

И Context останется неизменным независимо от того, что телефон не спит или не спит. Контекст основан на запущенном процессе / классе / блоке кода, в котором он находится. Если бы контекст вызывал проблему, я ожидал, что он сгенерирует исключение и принудительно закроет.

...