Предотвратите ошибку 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 со статикой идет в одном направлении.