Как исправить ошибку "процесс - это плохо" для Android-виджета?
Я разработал Android-виджет, и он отлично работает. Я добавил некоторые дополнительные функции и нажал обновление через Android Market. Теперь люди жалуются, что он больше не работает.
Ошибка, которую я вижу в журналах:
07-14 10:33:44.016: WARN/ActivityManager(78): Unable to launch app ...
for broadcast Intent { act=android.appwidget.action.APPWIDGET_ENABLED
cmp=... }: process is bad
07-14 10:33:44.026: WARN/ActivityManager(78): finishReceiver called
but none active
07-14 10:33:44.026: WARN/ActivityManager(78): Unable to launch app ...
for broadcast Intent { act=android.appwidget.action.APPWIDGET_UPDATE
cmp=... (has extras) }: process is bad
07-14 10:33:44.036: WARN/ActivityManager(78): finishReceiver called
but none active
Я обыскал, но я не могу найти нигде, что означает неправильный метод, поэтому я не знаю, как это исправить.
Однако перезапуск телефона (или эмулятора) заставляет проблему уйти, но это не то, что я хочу, чтобы мои пользователи делали это.
Может кто-то, пожалуйста, помогите мне объяснить, в чем причина ошибки и как ее исправить?
Ответы
Ответ 1
У меня такая же проблема, и моя нынешняя теория заключается в том, что appWidget разбился, и когда он был перезапущен, у него были такие же плохие постоянные данные, что и при сбое при каждом перезапуске. Когда это происходит слишком часто, appWidget является "принудительной остановкой" ОС. Моя групповая помощь состоит в том, чтобы иметь событие касания, которое является "setOnClickPending", которое пользователь коснется (из-за разочарования, если необходимо) и будет обрабатываться внутри appWidget и reset appWidget.
Ответ 2
Я просто испытал это непосредственно перед упаковкой на рынок. Я следил за инструкциями и добавил атрибут android: label = "@string/app_name" к элементу приложения в моем манифесте...
- Удалите приложение
- Перезагрузите телефон/эмулятор
- Нажать новое приложение без этого атрибута
Viola! Работает для меня сейчас!
EDIT: для соответствия комментариям.
Ответ 3
Случилось со мной, когда мой BroadcastReceiver неоднократно пропускал исключение, заставляя систему убивать мое приложение.
Следующие вызовы получателю приведут к тому, что журналы "процесс плохие".
Решение в моем случае состояло в том, чтобы исключить утечку из BroadcastReceiver.
Это журналы, когда приложение убито (попробуйте найти их и найти причину):
W/ActivityManager﹕ Process com.company.app has crashed too many times: killing!
I/ActivityManager﹕ Killing proc 9344:com.company.app/u0a10239: crash
Ответ 4
Я ударил ошибку process is bad
на моем HTC Sensation OS 2.3.4 после удаления разрешения INTERNET
на моем AndroidManifest.xml.
W/ActivityManager (253): не удается запустить приложение MY_DOMAIN.flashback/10132 для трансляции Intent { act = android.intent.action.PHONE_STATE flg = 0x20000000 (есть дополнительные функции)}: процесс плох
Я тщательно пробовал много разных обходных решений, и я нашел единственный способ исправить:
- Удалите приложение через Настройки → Приложения.
- Извлеките аккумулятор из телефона (в меню Android "Отключить питание" было выполнено не).
- Включите устройство снова.
- Снова установите APK с помощью
adb install <myapp>
.
Я хочу воспользоваться этой возможностью, чтобы указать, что для меня работало НЕ (поскольку, как представляется, много FUD о том, как исправить эту ошибку):
- Удалите приложение, перезагрузитесь с помощью меню телефона Android (нажмите и удерживайте кнопку и выберите "Отключить питание" ), снова включите, переустановите.
- Удалите, используйте
adb kill-server
, затем adb start-server
, переустановите.
- Удалите, запустите
adb shell
, затем ps
, это вовсе не показывало мое приложение.
- Удалите, выполните чистую сборку в Eclipse, переустановите.
Интересно, была ли основная проблема вызвана уменьшением размера моего приложения. Я думаю, что он использовался для распаковки на flashback-1.apk
и flashback-2.apk
на устройстве, тогда как теперь он распаковывается только для одного flashback-1.apk
.
Ответ 5
Я просто получаю эту ошибку.
Я исправляю ошибку, и я удаляю какой-то исходный код, вызывающий из OnConnectionReceiver.onReceiver()
, возможно, вызов будет стоить некоторое время.
Ответ 6
Я столкнулся с этой проблемой. причина заключалась в том, что WLAN-вызов wifi.getConnectionInfo(). getScanResults(); может возвращать нуль вместо пустого списка в некоторых случаях. Я нашел это после регистрации logcat в течение нескольких часов. Когда приложение столкнулось с ошибкой и разбилось, прикосновение к виджету дало бы мне ту же ошибку "плохого процесса", которую вы упомянули здесь, поскольку намерение не открывало приложение повторно, но оно застревает в разбитом состоянии. Угадайте, что это именно то, как Android имеет дело с разбитым виджетами.
Ответ 7
У меня было исправлено так:
удалите приложение и установите его снова.
Я получил эту ошибку, когда я установил "тестовое" приложение с тем же именем пакета и перепутал что-то в данных кеша приложения или где-то еще.
Ответ 8
У меня возникла аналогичная проблема. Когда я просмотрел свой код, я понял, что это были значения по умолчанию, которые были виновниками. Убедитесь, что ваши значения по умолчанию являются логическими и положительными. Например, если у вас есть фоновый сервис, начинающийся с определенного интервала, убедитесь, что значение по умолчанию, которое вы установили для него, является подходящим.
Ответ 9
Проблема для меня также связана с XML-спецификой, у меня был элемент TextView, который не указывал layout_width и layout_height, потому что они наследовали стиль, который их не содержал. Мой файл styles.xml не был проверен для этого eclipse. Когда я запустил приложение, я получил ошибку, которую должны указывать эти представления. Когда я исправил ошибку, я получил ошибку process is bad
и мне пришлось принудительно выйти.
К сожалению, я думаю, что некоторые настройки были сохранены, поэтому восстановление исправления оказалось недостаточным после исправления. Мне пришлось удалить приложение - перезагрузите телефон (чтобы устранить сом постоянные данные), и когда я переустановил, я восстановился после ошибки.
Ответ 10
Немного не по теме, но на некоторых устройствах Android можно воспроизвести эту ошибку, написав приложение, которое создает UncaughtExceptionHandler
в onCreate
, чтобы перезапустить приложение после сбоя, а затем делает что-то, чтобы вызвать необработанное исключение (либо выбросить RuntimeException
, либо сделать что-то, что вызывает NullPointerException
, или что-то еще). Ниже приведен пример кода примера.
Я пробовал это на двух устройствах: Samsung Galaxy Tab 2 и Verizon Ellipsis 7. С вкладкой 2 я не мог вызвать проблему, пока я запускал приложение из Eclipse - он сбой и перезапуск многократно и никогда не будет убит. Вместо этого мне пришлось экспортировать приложение в apk, установить через adb, запустить приложение, а после 4-8 сбоев и перезагрузки Android убьет приложение с сообщением об ошибке выше (Process com.buggy.app has crashed too many times: killing!
).
С помощью Ellipsis 7 я никогда не мог воспроизвести проблему. Багги-приложение неоднократно терпело крах и перезагружалось, и ОС никогда не убивала его даже после 10 минут этого.
Пример кода для многократного сбоя приложения:
public void onCreate(Bundle savedInstanceState) {
mContext = this.getApplicationContext();
UncaughtExceptionHandler uehandler = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
// restart app after 100 milliseconds
PendingIntent myActivity = PendingIntent.getActivity(mContext, 0,
new Intent(mContext, MyActivity.class),
PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmManager = (AlarmManager)
mContext.getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 100,
myActivity);
System.exit(2);
// re-throw critical exception further to the os (important)
Thread.getDefaultUncaughtExceptionHandler().uncaughtException(thread, ex);
}
};
Thread.setDefaultUncaughtExceptionHandler(uehandler);
throw new RuntimeException("Crash the app!");
}
Ответ 11
У меня была та же проблема. Я дошел до того момента, когда перезагрузка и повторная установка приложения не помогли решить эту проблему. Я был расстроен. Я удалил все из класса, который расширил AppWidgetProvider, и запустил приложение только с двумя пустыми методами: onUpdate и onReceive. Наконец, решена проблема.
Возможно, это не решит ваш, но кто знает. Попробуйте.
Ответ 12
"Процесс плохой" происходит из-за нескольких сбоев приложения (или BroadcastReceiver, Service или другого компонента). После нескольких из них система решает, что ей это надоело, и предотвращает повторный запуск процесса.
Перезагрузка очистит счетчик сбоев, но его также можно очистить, убив системный сервер:
adb shell killall system_server
Это эффективно сделает "мягкую перезагрузку". Я нахожу это намного быстрее, чем фактическая перезагрузка.
Ответ 13
Это сработало для меня!
Измените ваше неявное намерение на явное намерение, потому что запуск неявных намерений Oreo не выполняется в фоновом режиме!
Поэтому при создании объекта Intent передайте имя класса, который вы хотите запустить.https://developer.android.com/about/versions/oreo/background.html
Ответ 14
У меня была такая же проблема с моим проектом. Я думаю, стоит отметить, что я мог бы исправить эту проблему магически, просто удалив некоторые новые строки из моего кода в Eclipse. В качестве примера я изменил следующий код,
Intent clickIntent = new Intent(this.getApplicationContext(),
MyWidgetProvider.class);
к
Intent clickIntent = new Intent(this.getApplicationContext(),MyWidgetProvider.class);