【问题标题】:Android service crash behaviourAndroid 服务崩溃行为
【发布时间】:2013-04-19 11:48:32
【问题描述】:

我知道服务崩溃行为在 android 中很常见,如果发生崩溃,服务将自动重启。

我有三个服务(A、B、C)在启动时运行,一个服务(A)启动另外两个服务(B 和 C)。所以我的问题是,如果一项服务崩溃,那么其他两项服​​务同时崩溃是否会产生影响?

当我测试这些服务时,80% 的时间如果我的服务 A 崩溃,那么其他两个服务也会崩溃,而 20% 的时间,一次只有一个服务 (A/B/C) 崩溃。

这些服务在崩溃时的正确行为是什么?

【问题讨论】:

  • 当您说“崩溃”时,您的意思是存在错误,还是仅仅意味着服务停止?如果因错误而崩溃,请发布您的 logcat 输出。
  • 通常在长时间运行后,如果内存不足,则android服务崩溃,它们将自动重启...我的服务没有因错误而崩溃...如果设备内存崩溃低所以要回收内存
  • 根据文档,服务通常执行一项任务,当该任务完成时,它们会自行停止。也许你应该看看你的服务试图完成什么,以及它们是否因为完成了工作而停止了自己。还要看看为什么内存越来越低。另外请注意,即使服务 A 被破坏,服务 B 和 C 也可以继续运行。
  • 我不会在任何地方停止我的服务...我希望它们一直运行。

标签: android service


【解决方案1】:

当 Android 操作系统的内存不足时,它会首先关闭后台占用内存的所有内容 - 这是已定义的行为。

您应该使用“START_STICKY”启动您的服务,这样操作系统将在它再次拥有内存时重新启动您的服务(这可能不会发生),如下所示:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i("LocalService", "Received start id " + startId + ": " + intent);
    // We want this service to continue running until it is explicitly
    // stopped, so return sticky.
    return START_STICKY;
}

查看详细答案: How to force a service restart?

您可以在此处阅读有关服务的更多信息: http://developer.android.com/reference/android/app/Service.html

【讨论】:

    【解决方案2】:

    “我的问题是,如果一个服务崩溃,那么其他两个服务同时崩溃会不会有影响?”

    不,不会的。

    “我有三个服务(A、B、C)在启动时运行,一个服务(A)启动另外两个服务(B 和 C)。”

    这没有什么问题,但我建议在启动时独立启动每个服务。为什么?因为它会减少您的服务之间不必要的聚合。

    “这些服务在崩溃时的正确行为是什么?”

    系统会自行终止服务以获取内存。

    没有“正确”或固定的顺序可以杀死您的服务,这完全取决于谁有更多的内存要释放并且正在做不太重要的事情。

    【讨论】:

      【解决方案3】:

      如果服务 A 依赖于服务 B/c。不仅会导致破坏,否则不会。

      例如,如果您的应用使用 FirebaseAuth 服务。 在 gms 更新时,FirebaseAuth 服务将被终止并重新启动,您的应用服务也将被终止并重新启动。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多