【问题标题】:Prevent Android "process is bad" error防止Android“进程坏”错误
【发布时间】:2014-10-19 15:56:37
【问题描述】:

过程错误似乎没有很好的记录,我只能找到解决方法。相反,我对这个错误的原因以及如何防止它发生感兴趣,而不是如何通过重新启动、重新启动应用程序等手动处理它。

我的特定应用程序使用 AlarmManager 来启动 IntentService,它每 ~30 秒运行 ~10 秒。这在创建应用程序时调用:

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

只需重新打开应用程序即可解决此问题。但我需要知道如何防止它!此服务的目的是在活动停止或销毁时在后台运行,因此它必须在没有任何用户交互或解决方法的情况下防止此错误。

【问题讨论】:

  • 你的服务中有静态变量吗?
  • 不确定,好几年没碰过代码,也没有权限了。但很可能是的。怎么会?

标签: android intentservice


【解决方案1】:

好机会是它与活动生命周期的处理有关。

这让我想起了我最近在没有完全理解的情况下解决的一个案例,因为文档对于在你的 Activity 上调用 onStop() 后你可以依赖什么不是很具体。而你究竟不应该做什么......

所以我只能给你一些提示:

如果我的猜测是正确的,那么当您的应用(部分)从内存中删除时,您会遇到无法正确恢复的问题。 尝试将开发人员设置中的后台应用程序限制设置为“无”。 我怀疑通过此设置,您的问题在将其置于后台时将完全可重现。否则你可能会在这里停止阅读。

我有一个线程在 onStop() 之后继续运行,它还保留了一些引用。在 onPause() 中停止线程并等待它完成解决了我的问题。我还需要同步我的 onStop() 因为阻塞 onPause() 导致 onStop() 并行出现。我还需要将我的一些初始化从 onCreate() 移到 onResume()。但是,一旦我弄清楚在 onResume() 和 onStop() 中要删除的内容,这一点就很明显了。

可能带有静电的小费会朝同一个方向移动。

【讨论】:

  • 感谢您的提示,我不再拥有此代码并且无法验证,但我希望这对遇到相同问题的其他人有用!
【解决方案2】:

“进程错误”错误发生在您的服务崩溃几次之后。系统阻止它重新出现,而是打印该消息。您可以通过重新启动或终止系统服务器来更快地清除崩溃计数:

adb shell killall system_server

这实际上是一个“软重启”,会杀死/重启你正在进行的任何进程。

【讨论】:

    猜你喜欢
    • 2014-07-21
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    相关资源
    最近更新 更多