Я изучаю, есть ли какие-либо способы предотвратить уничтожение службы Android из-за необработанного исключения.
У нас есть 10 приложений пользовательского интерфейса, взаимодействующих с 5-6 службами. Платформа — Android 2.2.
Из-за непредвиденных обстоятельств некоторая логика служб время от времени вызывает исключения. Это приводит к тому, что эти службы убиваются этими раздражающими всплывающими окнами ANR. Пока мы работаем над решением, которое устраняет первопричину этих исключений, я не хочу, чтобы Android отключал службу-нарушитель.
Похоже, я могу зарегистрировать обработчик исключений Uncaught по умолчанию для всех потоков в службах. Это просто дает мне возможность записать что-то об исключении. Это хорошо. Я наткнулся на множество сообщений, в которых использовалась эта техника для записи информации о сбоях в файл для последующего использования. Люди предложили не создавать исходное исключение, чтобы предотвратить всплывающее окно ANR. Я также нашел несколько статей, в которых говорилось, что он может оставить вашу службу в полумертвом состоянии. Правильнее всего убить службу и перезапустить. Убийство и перезагрузка меня не интересуют.
Я не совсем понял часть полумертвого состояния, если вы не выдаете исключение. Я собираюсь исследовать дальше. А пока мне интересно, есть ли у людей предложения.
Моя цель – предотвратить появление всплывающих окон ANR. Я хочу, чтобы решение о перезапуске службы принимал мой код, а не платформа Android.
Вот что мне любопытно найти:
1) Есть ли в манифесте какой-либо флаг, который вы можете изменить, чтобы предотвратить уничтожение служб кодом фреймворка?
2) Существуют ли какие-либо методы, которые вы можете переопределить в службе, которые позволяют обрабатывать неперехваченные исключения, но при этом позволяют потоку службы вернуться в состояние ожидания для следующего запроса от клиента?
Спасибо за предложения.
Видеогай
Обновление:
Обработчик исключений Uncaught по умолчанию здесь не помогает. Это дает вам возможность что-то регистрировать, но служебный поток все еще завершается.
Вам нужно изменить структуру Android, чтобы она не убивала процессы. ActivityManagerService.java в среде Android имеет разные пороговые значения, как долго служба может работать без каких-либо клиентов, сколько фоновых действий/служб вы можете иметь, тайм-ауты для службы и инициализации пользовательского интерфейса. Мы увеличили эти значения.