【问题标题】:Android service killed安卓服务被杀
【发布时间】:2010-06-15 01:09:16
【问题描述】:

我有一个服务在与我的应用程序相同的进程中运行。

有时 Android 操作系统决定终止我的服务(可能是由于内存不足)。

我的问题是:我的应用程序是否与服务一起被杀死?或者它是如何工作的?

谢谢!

【问题讨论】:

    标签: android service


    【解决方案1】:

    首先请务必阅读:http://developer.android.com/guide/components/processes-and-threads.html#Lifecycle

    其中的关键在于,在 Android 上,进程只是代码的容器,或者具体来说是一个或多个组件(活动、服务、接收器、提供者)。默认情况下,.apk 中的所有组件都有自己的专用进程,它们都一起运行。这几乎总是你想要的。

    当用户直接与该进程的一个组件(即一个活动)交互时,Android 将非常努力地保持该进程运行,并且您不会看到它被杀死,除非在特殊情况下。

    当用户不再直接与流程交互时,它相对于参考文档中描述的其他流程变得可消耗。也就是说,空进程(没有有趣的组件)将在持有用户一直在使用的活动的进程之前被杀死,这些活动将在具有正在运行的服务的进程之前被杀死。因此,拥有一个正在运行的服务往往会以牺牲其他进程为代价来保留您的进程。

    同时,我们需要处理好越来越多的应用程序让服务运行,通常是无限期地运行,并且经常出现内存泄漏。因此,随着服务运行时间越来越长,Android 将越来越少地尝试保持其进程继续运行。实际上,这意味着将其移至后台存储桶,直到内存不足杀手将其取出。之后,如果服务还想运行,那么会创建一个新的进程来重新启动它。

    结果是,对于长时间运行的正常服务,其进程会在一段时间后被杀死是预期的行为。这不需要停止服务;想要继续运行的服务会这样做,它只需要在新进程中实例化即可。

    当然,只要用户正在与您的进程中的某个活动进行交互,该进程就不会被终止,因为这会将其拉到前台类别,而不管其中的任何服务正在发生什么。

    【讨论】:

    • 感谢您的帮助!所以更具体一点:我从 Application 子类化,并在其中持有对我的 Service 对象的引用。当我的服务被终止时,我怎样才能获得对新服务的引用?还是我的 Application 对象也随之消失,当它被重新实例化时,一切都与我第一次启动应用程序时一样?
    • 当为了内存而杀掉某些东西时,整个进程(包括应用程序对象)都被杀掉,此时没有代码在其中执行。如果服务只是因为不再需要运行而被销毁,它的 onDestroy() 将被调用,当以后需要该服务时,会创建一个新实例并调用 onCreate()。我个人一般建议不要使用应用程序;除了使用静态单例类之外,它并没有真正为您提供任何东西,而且我认为为人们设置了期望(w.r.t. 有一个更传统的应用程序模型)实际上并不成立。
    • 我明白你的意思。我遇到的唯一问题是,强迫我使用 Application 类是我不想从我所有的不同活动中绑定到服务。我只在我的应用程序的 onCreate 方法期间调用绑定,然后所有其他活动通过我的应用程序单例访问服务。你能推荐更好的东西吗?
    • 让你的单例接受一个它可以绑定的应用程序对象(或只是应用程序的上下文)。
    • "这不需要停止服务;想要继续运行的服务会这样做,它只需要在新进程中实例化。"两个问题,有没有办法告诉一个进程可能很快就会终止,你如何在一个新进程中创建一个新服务?
    【解决方案2】:

    进程被低内存杀手杀死,而不是应用程序。因此,除非您做额外的工作让您的服务在不同的进程中运行,否则您的活动将与您的服务一起被终止。

    低内存杀手不会尝试销毁进程中的任何对象,尽管活动管理器可能会在不再需要的活动对象上调用 onDestroy。但这是作为常规活动生命周期的一部分发生的,而不是由于内存不足。

    (顺便说一句,我不清楚您是指一般的“应用程序”,还是扩展 Application 的对象,或者您的意思是显示 UI 的活动。)

    【讨论】:

    • 应用程序我的意思是我的对象从应用程序扩展
    【解决方案3】:

    应用程序是具有用户界面的东西,如果您已经包含了一个服务,那么它肯定会被杀死,因为一旦缓存的应用程序队列变满,应用程序就会终止

    所以创建与应用程序分开的服务,或者换句话说,为它创建一个其他项目:)

    顺便说一句,我不是一位经验丰富的 Android 开发人员,但我认为我是通过观看 Google 的 Android 开发生命周期视频了解到的

    【讨论】:

    • 绝对不要创建另一个项目。除非在非常特殊的情况下,否则不要让服务在另一个进程中运行(通过 android:process)。
    • 是的,我正在努力将我的服务保持在同一个过程中。对我来说,调用静态方法可能比实现aidl更快更容易
    猜你喜欢
    • 2015-03-18
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    相关资源
    最近更新 更多