Подтвердить что ты не робот

Как исправить ошибку "процесс - это плохо" для 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 

Я обыскал, но я не могу найти нигде, что означает неправильный метод, поэтому я не знаю, как это исправить. Однако перезапуск телефона (или эмулятора) заставляет проблему уйти, но это не то, что я хочу, чтобы мои пользователи делали это. Может кто-то, пожалуйста, помогите мне объяснить, в чем причина ошибки и как ее исправить?

4b9b3361

Ответ 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);