Известны ли проблемы со службами Android в версии 4.1.x (Jelly Bean)?
Мой вопрос - выстрел в темноте: как обстоят дела с Android 4.x / Jelly Bean? Известны ли проблемы со службами, липкостью, передним планом и т. Д.?
Предыстория: я успешно протестировал свое приложение музыкального проигрывателя на всевозможных устройствах и эмуляторах Android, а затем совсем недавно на физическом устройстве Jelly Bean (Samsung Rugby Pro). Я обнаружил, что MediaPlayer
onCompletion
функция не срабатывает постоянно, когда экран выключен. Чаще всего он не срабатывает в течение нескольких минут. Когда экран включен, независимо от того, отображается моя активность или нет, приложение работает нормально.
(Нет проблем с Gingerbread, KitKat, Lollipop или Marshmallow. У меня есть физические устройства для этих версий, и все они работают безупречно.)
Информация об устройстве:
- ВЕРСИЯ ОС: 3.0.31-656355
- РЕЛИЗ: 4.1.1
- УСТРОЙСТВО: comancheatt
- МОДЕЛЬ: SAMSUNG-SGH-I547
- ПРОДУКТ: команчук
- БРЕНД: Samsung
- ОТОБРАЖЕНИЕ: JRO03L.I547UCBLL1
- CPU_ABI: armeabi-v7a
- CPU_ABI2: armeabi
- ТС: qcom
- ID: JRO03L
- ПРОИЗВОДИТЕЛЬ: Samsung
- ПОЛЬЗОВАТЕЛЬ: se.infra
- ВЕДУЩИЙ: СЭП-125
1 ответ
Я понял это; Я надеюсь, что это поможет вам тоже...
Проблема не в увольнении onCompletion
событие, а скорее reset()
блокирует до бесконечности. Ранее я связывал это с проблемой Android № 959: "сбой" MediaPlayer (блокирует вызывающий поток) при сбросе или освобождении неиспользуемого MediaPlayer, что было неправильно для моего случая.
Моей конкретной проблемой было агрессивное поведение во время сна на моем тестовом устройстве. Эта ошибка всплывала, когда я запускал в режиме полета с несколькими другими приложениями, потому что вызов reset()
(или же release()
) также выпускает MediaPlayer
экземпляра WakeLock
, Как только это произойдет, устройство перейдет в спящий режим и код будет заблокирован в этой функции. Я не смог воспроизвести это с подключенным и / или подключенным отладчиком, потому что ни один из них не давал устройству спать!
Моим решением было создать отдельно управляемый WakeLock
который я acquire()
в основном, когда начинается воспроизведение и release()
после того, как все песни проиграли. Технически, я делаю это только тогда, когда действие было приостановлено, а также освобождаю при возобновлении, потому что нет необходимости держать WakeLock
когда устройство уже не спит.
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyTag");
wakeLock.acquire();