【发布时间】:2010-06-15 01:09:16
【问题描述】:
我有一个服务在与我的应用程序相同的进程中运行。
有时 Android 操作系统决定终止我的服务(可能是由于内存不足)。
我的问题是:我的应用程序是否与服务一起被杀死?或者它是如何工作的?
谢谢!
【问题讨论】:
我有一个服务在与我的应用程序相同的进程中运行。
有时 Android 操作系统决定终止我的服务(可能是由于内存不足)。
我的问题是:我的应用程序是否与服务一起被杀死?或者它是如何工作的?
谢谢!
【问题讨论】:
首先请务必阅读:http://developer.android.com/guide/components/processes-and-threads.html#Lifecycle
其中的关键在于,在 Android 上,进程只是代码的容器,或者具体来说是一个或多个组件(活动、服务、接收器、提供者)。默认情况下,.apk 中的所有组件都有自己的专用进程,它们都一起运行。这几乎总是你想要的。
当用户直接与该进程的一个组件(即一个活动)交互时,Android 将非常努力地保持该进程运行,并且您不会看到它被杀死,除非在特殊情况下。
当用户不再直接与流程交互时,它相对于参考文档中描述的其他流程变得可消耗。也就是说,空进程(没有有趣的组件)将在持有用户一直在使用的活动的进程之前被杀死,这些活动将在具有正在运行的服务的进程之前被杀死。因此,拥有一个正在运行的服务往往会以牺牲其他进程为代价来保留您的进程。
同时,我们需要处理好越来越多的应用程序让服务运行,通常是无限期地运行,并且经常出现内存泄漏。因此,随着服务运行时间越来越长,Android 将越来越少地尝试保持其进程继续运行。实际上,这意味着将其移至后台存储桶,直到内存不足杀手将其取出。之后,如果服务还想运行,那么会创建一个新的进程来重新启动它。
结果是,对于长时间运行的正常服务,其进程会在一段时间后被杀死是预期的行为。这不需要停止服务;想要继续运行的服务会这样做,它只需要在新进程中实例化即可。
当然,只要用户正在与您的进程中的某个活动进行交互,该进程就不会被终止,因为这会将其拉到前台类别,而不管其中的任何服务正在发生什么。
【讨论】:
进程被低内存杀手杀死,而不是应用程序。因此,除非您做额外的工作让您的服务在不同的进程中运行,否则您的活动将与您的服务一起被终止。
低内存杀手不会尝试销毁进程中的任何对象,尽管活动管理器可能会在不再需要的活动对象上调用 onDestroy。但这是作为常规活动生命周期的一部分发生的,而不是由于内存不足。
(顺便说一句,我不清楚您是指一般的“应用程序”,还是扩展 Application 的对象,或者您的意思是显示 UI 的活动。)
【讨论】:
应用程序是具有用户界面的东西,如果您已经包含了一个服务,那么它肯定会被杀死,因为一旦缓存的应用程序队列变满,应用程序就会终止
所以创建与应用程序分开的服务,或者换句话说,为它创建一个其他项目:)
顺便说一句,我不是一位经验丰富的 Android 开发人员,但我认为我是通过观看 Google 的 Android 开发生命周期视频了解到的
【讨论】: