Как предотвратить уничтожение службы Android из-за неперехваченных исключений?

Я изучаю, есть ли какие-либо способы предотвратить уничтожение службы Android из-за необработанного исключения.
У нас есть 10 приложений пользовательского интерфейса, взаимодействующих с 5-6 службами. Платформа — Android 2.2.
Из-за непредвиденных обстоятельств некоторая логика служб время от времени вызывает исключения. Это приводит к тому, что эти службы убиваются этими раздражающими всплывающими окнами ANR. Пока мы работаем над решением, которое устраняет первопричину этих исключений, я не хочу, чтобы Android отключал службу-нарушитель.

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

Я не совсем понял часть полумертвого состояния, если вы не выдаете исключение. Я собираюсь исследовать дальше. А пока мне интересно, есть ли у людей предложения.
Моя цель – предотвратить появление всплывающих окон ANR. Я хочу, чтобы решение о перезапуске службы принимал мой код, а не платформа Android.

Вот что мне любопытно найти:
1) Есть ли в манифесте какой-либо флаг, который вы можете изменить, чтобы предотвратить уничтожение служб кодом фреймворка?

2) Существуют ли какие-либо методы, которые вы можете переопределить в службе, которые позволяют обрабатывать неперехваченные исключения, но при этом позволяют потоку службы вернуться в состояние ожидания для следующего запроса от клиента?

Спасибо за предложения.

Видеогай

Обновление:
Обработчик исключений Uncaught по умолчанию здесь не помогает. Это дает вам возможность что-то регистрировать, но служебный поток все еще завершается.

Вам нужно изменить структуру Android, чтобы она не убивала процессы. ActivityManagerService.java в среде Android имеет разные пороговые значения, как долго служба может работать без каких-либо клиентов, сколько фоновых действий/служб вы можете иметь, тайм-ауты для службы и инициализации пользовательского интерфейса. Мы увеличили эти значения.


person videoguy    schedule 14.04.2012    source источник


Ответы (2)


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

person lrAndroid    schedule 14.04.2012
comment
Это один из способов сделать службу резидентной на все время. Мы уже делаем это для некоторых сервисов, которые на самом деле не предоставляют каких-либо вспомогательных интерфейсов, но любят работать непрерывно. Тем не менее, это другая проблема. - person videoguy; 15.04.2012

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

No.

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

No.

person CommonsWare    schedule 14.04.2012