Предотвратите ошибку Android "process is bad"
Процесс - плохая ошибка, похоже, не очень хорошо документирована, и мне удалось найти обходные пути. Вместо этого я заинтересован в причине этой ошибки и способах ее предотвращения, а не о том, как вручную ее обрабатывать с помощью перезагрузки, перезапуска приложения и т.д.
В моем конкретном приложении AlarmManager запускает IntentService, который работает в течение ~ 10 с каждые 30 секунд. Это называется созданием приложения:
Intent serviceIntent = new Intent(appContext, MyService.class);
serviceIntent.putExtra("service_extra", extra);
launchService = PendingIntent.getService(
appContext,
LAUNCH_SERVICE_REQUEST_CODE,
scanIntent,
PendingIntent.FLAG_UPDATE_CURRENT
);
alarmManager.setInexactRepeating(
AlarmManager.RTC,
System.currentTimeMillis() + interval,
interval,
launchService
);
Это работает, как ожидалось, большую часть времени. Однако очень редко служба не запускается в течение неопределенного периода времени, иногда по часам. Следующая ошибка наблюдается каждые ~ 30 секунд, поэтому я знаю, что мои будильники пытаются запустить IntentService по расписанию, но попытка не удалась с ошибкой процесса.
Unable to launch app com.example.android/10024 for service Intent { cmp=com.example.android/.MyService (has extras) }: process is bad
Это фиксируется просто повторным открытием приложения. Но мне нужно знать, как это предотвратить! Цель этой службы - работать в фоновом режиме, пока действия останавливаются или уничтожаются, поэтому она должна предотвращать эту ошибку без какого-либо взаимодействия с пользователем или обходной путь.
Ответы
Ответ 1
Хороший шанс заключается в том, что он связан с обработкой жизненного цикла активности.
Это напоминает мне случай, который я недавно решил без его полного понимания, потому что документация не очень специфична для того, на что вы можете положиться после того, как onStop() вызывается в вашей деятельности. И что именно вы не должны делать...
Поэтому я могу только дать вам несколько советов:
Если моя догадка правильная, у вас возникла проблема с неправильным восстановлением, когда ваше приложение частично удалено из памяти.
Попробуйте установить ограничение для background-Apps в настройках разработчика на "none".
Я подозреваю, что с этой настройкой ваша проблема будет полностью воспроизведена, когда вы установите ее на задний план. В противном случае вы, вероятно, можете перестать читать здесь.
У меня был поток, который продолжал работать после onStop(), который также содержал некоторые ссылки. Остановить поток в onPause(), а также дождаться его, чтобы финч решил мою проблему. Мне также нужно было синхронизировать мой onStop(), потому что блокирование onPause() привело к тому, что onStop() появился в paralell. Мне также нужно было перенести часть моей инициализации с onCreate() на onResume(). Но это было совершенно очевидно, как только я понял, на что срываться в onResume() и onStop().
Вероятно, tipp со статикой идет в одном направлении.