Предотвратить процесс Android - плохая ошибка

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

Мое конкретное приложение использует 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

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


person tep    schedule 19.10.2014    source источник
comment
Есть ли в вашей службе какая-либо статическая переменная?   -  person Rahul    schedule 01.08.2017
comment
Не уверен, не прикасался к коду годами и больше не имею доступа. Но скорее всего да. Как так?   -  person tep    schedule 26.08.2017


Ответы (2)


Хороший шанс заключается в том, что это связано с обработкой жизненного цикла активности.

Это напоминает мне случай, который я недавно решил, не полностью его понимая, потому что документация не очень конкретна в отношении того, на что вы можете положиться после того, как onStop() вызывается в вашей деятельности. А чего конкретно делать нельзя...

Поэтому я могу только дать вам несколько советов:

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

У меня был поток, который продолжал работать после onStop(), который также сохранял некоторые ссылки. Остановка потока в onPause(), а также ожидание его завершения решили мою проблему. Мне также нужно было синхронизировать мой onStop(), потому что блокировка onPause() приводила к тому, что onStop() работал параллельно. Мне также нужно было перенести часть моей инициализации из onCreate() в onResume(). Но это было совершенно очевидно, как только я понял, что нужно снести в onResume() и onStop().

Вероятно, типп со статикой идет в том же направлении.

person moritz    schedule 24.10.2017
comment
Спасибо за подсказку, у меня больше нет этого кода, и я не могу проверить, но я надеюсь, что это будет полезно кому-то еще с той же проблемой! - person tep; 01.11.2017

Ошибка «Процесс неверный» возникает после того, как ваш сервис несколько раз аварийно завершает работу. Система не позволяет ему вернуться и вместо этого печатает это сообщение. Вы можете сбросить счетчик сбоев, перезагрузив компьютер или, что быстрее, уничтожив системный сервер:

adb shell killall system_server

Это фактически «мягкая перезагрузка», которая убивает/перезапускает любые процессы, которые у вас есть.

person Allen Luce    schedule 24.04.2019