Intereting Posts
Скрыть клавиатуру мягкого ввода, когда диалог закрывается Как отменить выполнение AsyncTask из скрытого элемента в функции getView () в Android? Android выполняет оператор if, хотя он никогда не должен выполняться? Com.google.android.feedback в Google Analytics Приложение не установлено Как заставить элементы внутри фиксированного позиционного элемента реагировать на события onclick javascript в веб-браузере Android? Камера Android – иногда, когда я фотографирую, приложение зависает, и камера не используется Когда используется триангуляция ячеистой ячейки? Можно ли просто скомпилировать APK с помощью Emma с помощью Android build.xml и не запускать никаких тестов Как отладить apk, подписанный для выпуска? Доступ / обновление данных на сервере из приложения Android с помощью веб-API, предоставляемого веб-разработчиком? Есть ли способ иметь один и только один экземпляр каждого вида деятельности? Фрагмент не вызывает onSaveInstanceState при прокрутке ViewPager? Запуск медиаплеера с использованием намерения Как вызвать фрагмент из BaseAdapter Class Android?

Отладка служб

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

В чем проблема? Служба аварийно завершает работу почти все время, когда пользователь пытается это сделать .. почти все остальное. Например, воспроизведение песни, а затем открытие игры приводит к сбою службы, иногда могут возникать такие же легкие вещи, как просмотр веб-страниц на хроме.

Несколько деталей:

1 – Услуга запускается через startService(new Intent(this, MyMusicService.class)); Но когда пользователь покидает активность, я вызываю startForeground(mId, mNotification); Чтобы показать постоянное уведомление, которое обеспечивает легкие элементы управления, а также потому, что startForeground() предназначен для служб, которые должны быть приоритетными, поскольку их уничтожение с помощью startForeground() будет нарушать работу пользователя (музыка останавливается, если служба убита)

2 – Я попытался воспроизвести крах, и это, безусловно, происходит, когда вы делаете не такую ​​тяжелую работу, как просмотр на хроме (это будет воспроизводить крах почти в 50% случаев) и всегда, когда вы делаете такие вещи, как запуск 2-го запуска храма. FYI, если вообще ничего не делать – просто играя музыку на заднем плане и в режиме ожидания, воспроизведение вообще не остановится, и оно работает именно так, как планировалось.

3 – Телефон, который я использую в качестве тестового устройства, никоим образом не является устройством с медленной или низкой памятью, это Galaxy Nexus.

4 – Я пробовал ловить несколько длин и иногда просто говорит:

 02-24 06:53:32.586: I/ActivityManager(387): Process com.deadpixels.light.player (pid 27720) has died. 

Без каких-либо других сообщений, а иногда одно и то же сообщение сопровождается WINDEATH:

  02-24 06:53:32.586: W/ActivityManager(387): Scheduling restart of crashed service com.deadpixels.light.player/.service.MyMusicService in 5000ms 02-24 06:53:32.602: W/InputDispatcher(387): channel '418d09c8 com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x9 02-24 06:53:32.602: E/InputDispatcher(387): channel '418d09c8 com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity (server)' ~ Channel is unrecoverably broken and will be disposed! 02-24 06:53:32.602: W/InputDispatcher(387): Attempted to unregister already unregistered input channel '418d09c8 com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity (server)' 02-24 06:53:32.602: I/WindowState(387): WIN DEATH: Window{418d09c8 u0 com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity} 

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

5 – Я попытался использовать ACRA, чтобы получить дополнительную информацию о сбое, но, несмотря на то, что все кажется правильно настроенным, после сбоя журнал не отправляется, или просто ничего не происходит. Я знаю, что ACRA обнаруживает сбой и запускает:

 02-24 06:53:37.719: D/ACRA(28293): ACRA is enabled for com.deadpixels.light.player, intializing... 02-24 06:53:37.742: D/ACRA(28293): Using default Mail Report Fields 02-24 06:53:37.742: D/ACRA(28293): Looking for error files in /data/data/com.deadpixels.light.player/files 02-24 06:53:37.742: W/ACRA(28293): com.deadpixels.light.player reports will be sent by email (if accepted by user). 

Но ничто не отправляется ни на почтовое отправление, ни на форму в документах Google.

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

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

Спасибо за помощь!

Кажется, что ОС думает, что ваш сервис находится в фоновом режиме, как только пользователь покинет вашу деятельность, несмотря на то, что он является сервисом «переднего плана».

Я бы разработал ваш сервис MyMusicService несколько иначе:

  1. В onCreate подготовьте MediaPlayer .
  2. В реализации вашей услуги onStart или onStartCommand начните воспроизведение выбранного / соответствующего звукового файла. Приобретите частичный wake_lock, если вы хотите, чтобы музыка продолжала играть в фоновом режиме, даже если устройство спит. Верните START_STICKY .
  3. Добавить уведомление в строку состояния. 3 В onDestroy очистите все.

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

Здесь можно найти хороший учебник. http://www.youtube.com/watch?v=mcb99u8Nlgs&list=PL14AA2548E3C96B50

Обновление после того, как OP добавил комментарии / обновил «gist»:

Я вижу, что onReceive вашего mReceiver BroadcastReceiver в вашей службе обращается к базе данных. Это может быть проблемой. Отключите это до IntentService : в onReceive просто запустите IntentService используя тот же Intent что и onReceive . Затем IntentService может выполнять всю фактическую работу и не беспокоиться о возможном медленном доступе к базе данных, что приводит к убийству процесса.

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

У меня была такая же проблема, не могли бы вы проверить, совпадает ли ваш идентификатор с идентификатором вашего уведомления? Также проверьте, что он отличается от 0, потому что он затем свяжет его с идентификатором активности и умрет с активностью.

Изменить: Также проверьте, что ваш код не использует onHandle, а onStartCommand.

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

Разумное угадывание, конечно, но для меня это звучит так, как будто ваша служба имеет ссылку на вашу деятельность. Ваша деятельность, скорее всего, будет уничтожена, как только вы будете использовать другое приложение.

Несколько вопросов.

  • Выполняете ли ваш сервис и свою деятельность один и тот же процесс? (Это влияет на то, как информация между активностью и службой может использоваться совместно.)
  • Имеет ли ваш класс Activity какие-либо переменные, к которым пытается обратиться служба? (Тогда они принадлежат классу Application, если вообще).

Проверьте свой код, возможно, где-то вы сами уничтожаете свой процесс, например System.exit(0); , Если вы это сделаете, тогда будет журнал

 channel '418d09c8 com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity(server)' ~ Consumer closed input channel or an error occurred. events=0x902-24 06:53:32.602: E/InputDispatcher(387): channel '418d09c8 com.deadpixels.light.player/com.deadpixels.light.player.HomeActivity (server)' ~ Channel is unrecoverably broken and will be disposed!