如何解决Android Widget的“进程坏”错误?

时间:2010-07-15 08:15:11

标签: android android-widget

我开发了一个Android Widget,它运行正常。我添加了一些额外的功能,并推动了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 

我已经搜索过了,但是我无法找到任何错误进程的错误,因此我对如何解决它没有任何线索。 重新启动手机(或模拟器)会使错误消失,但这不是我希望用户做的事情。 有人可以帮我解释错误的原因是什么以及如何解决它?

13 个答案:

答案 0 :(得分:9)

我刚刚在市场包装前亲自体验过这一点。我按照指南并将android:label =“@ string / app_name”属性添加到我的清单中的应用程序元素...

  1. 卸载您的应用
  2. 重新启动手机/模拟器
  3. 推送没有此属性的新应用
  4. 中提琴!现在适合我!

    编辑:匹配评论。

答案 1 :(得分:8)

我遇到了同样的问题,我当前的理论是appWidget崩溃了,当它重新启动时,它有相同的坏持久数据,每次重启时都会崩溃。当这种情况经常发生时,操作系统会“强制停止”appWidget。我的乐队助手是有一个触摸事件,即用户将触摸的“setOnClickPending”(如果有必要,可以通过挫折),并且将在appWidget内部处理并重置appWidget。

答案 2 :(得分:8)

当我的BroadcastReceiver反复泄漏导致系统杀死我的应用程序的异常时发生在我身上。 接下来对接收器的调用将导致“进程坏”日志。

我的解决方案是确保BroadcastReceiver没有异常泄露。

这些是应用程序被杀死时的日志(尝试查找并查找原因):

W/ActivityManager﹕ Process com.company.app has crashed too many times: killing!
I/ActivityManager﹕ Killing proc 9344:com.company.app/u0a10239: crash

答案 3 :(得分:4)

从我的AndroidManifest.xml中删除process is bad权限后,我在HTC Sensation OS 2.3.4上遇到INTERNET错误。

  

W / ActivityManager(253):无法启动应用   MY_DOMAIN.flashback / 10132 for broadcast Intent {   act = android.intent.action.PHONE_STATE flg = 0x20000000(有额外内容)}:   过程很糟糕

我仔细尝试了很多不同的解决方法,我发现解决的唯一方法是:

  • 通过设置 - >卸载应用程序应用
  • 从手机中取出电池(使用Android“关闭电源”菜单工作)。
  • 再次打开设备。
  • 使用adb install <myapp>再次安装APK。

我想借此机会列出 NOT 为我工作的内容(因为似乎有很多关于如何修复此错误的FUD):

  • 卸载应用程序,使用Android手机菜单重新启动(按住按钮并选择“关闭电源”),再次打开,重新安装。
  • 卸载,使用adb kill-server,然后adb start-server,重新安装。
  • 卸载,运行adb shell然后ps,这根本不会显示我的应用运行。
  • 卸载,在Eclipse中进行干净的构建,重新安装。

我想知道底层问题是否是由于我的应用程序变小了。我认为它曾经解压缩到设备上的flashback-1.apkflashback-2.apk,而现在它只是解压缩到单个flashback-1.apk

答案 4 :(得分:2)

我刚收到此错误。 我修复了错误并删除了从OnConnectionReceiver.onReceiver()调用的一些源代码,也许调用会耗费一些时间。

答案 5 :(得分:2)

我遇到了这个问题。原因是WLAN调用wifi.getConnectionInfo()。getScanResults();可以在某些时段返回null而不是空列表。我在登录logcat几个小时后发现了这个。当应用程序遇到错误并崩溃时,触摸窗口小部件会给我同样的“坏过程”错误,因为意图没有重新打开应用程序,但是它会陷入崩溃状态。猜它就像Android处理崩溃的小部件一样。

答案 6 :(得分:1)

我得到了这样的解决方法:

卸载应用程序并重新安装。

当我安装了一个具有相同软件包名称的“测试”应用程序并且在应用程序缓存数据或其他地方弄乱了某些内容时,我收到了此错误。

答案 7 :(得分:0)

我的问题也与XML有关 - 特别是我有一个未指定layout_width和layout_height的TextView元素,因为它们继承了一个不包含它们的样式。我的styles.xml文件没有通过eclipse验证。当我运行应用程序时,我得到了必须指定这些视图的错误 - 当我修复错误时,我收到了process is bad错误,并且不得不强制退出。

不幸的是我认为维护了一些设置,因此修复后重建应用程序是不够的。我不得不卸载应用程序 - 重新启动手机(以消除持久性数据),当我重新安装时,我从错误中恢复过来。

答案 8 :(得分:0)

有点偏离主题,但在某些Android设备中,人们可以通过编写在UncaughtExceptionHandler中创建onCreate以在崩溃后重新启动应用程序的应用程序来重现性地导致此失败,然后执行某些操作导致未处理的异常(抛出RuntimeException,或执行导致NullPointerException或其他任何事情的事情。下面给出了一些示例代码。

我在两台设备上试过这个:三星Galaxy Tab 2和Verizon Ellipsis 7.使用Tab 2,我从Eclipse运行应用程序时无法解决问题 - 它会崩溃并重复重启,永远不会被杀死。相反,我必须将应用程序导出到apk,通过adb安装,启动应用程序,并在4-8崩溃并重新启动后,Android将使用上面的错误消息(Process com.buggy.app has crashed too many times: killing!)终止应用程序。

使用省略号7,我无法重现这个问题。有缺陷的应用程序会反复崩溃并重新启动,即使在10分钟后,操作系统也从未将其杀死。

反复崩溃app的示例代码:

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!");
}

答案 9 :(得分:0)

我遇到了同样的问题。我到了重新启动并重新安装应用程序并没有解决问题的地步。我很沮丧。我从扩展AppWidgetProvider的类中删除了所有内容,并在其中只运行了两个空方法运行应用程序:onUpdate和onReceive。终于解决了这个问题。

也许它不能解决你的问题,但谁知道呢。试一试。

答案 10 :(得分:0)

“进程错误”是由于应用程序(或BroadcastReceiver,Service或其他组件)多次崩溃所致。经过几次这些操作后,系统决定对这种行为感到厌烦,并阻止该过程再次开始。

重新启动将清除崩溃计数,但是也可以通过杀死系统服务器来清除它:

adb shell killall system_server

这将有效地进行“软重启”。我发现它比实际重新启动要快得多。

答案 11 :(得分:0)

这对我有用! 将您的隐式意图更改为显式意图,因为启动Oreo隐式意图不会在后台运行! 因此,基本上,在创建Intent对象时,传入您要启动的类名。 https://developer.android.com/about/versions/oreo/background.html

答案 12 :(得分:-3)

我的项目遇到了同样的问题。我认为值得指出的是,我可以通过从Eclipse中的代码中删除一些新行来神奇地解决这个问题。作为示例,我更改了以下代码,

Intent clickIntent = new Intent(this.getApplicationContext(),
MyWidgetProvider.class);

Intent clickIntent = new Intent(this.getApplicationContext(),MyWidgetProvider.class);