安卓服务被杀死

14

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

有时候,Android系统会决定杀掉我的服务(可能是由于内存不足)。

我的问题是:我的应用程序是否会随着服务被杀掉呢?还是它是如何工作的呢?

谢谢!

3个回答

35

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

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

当用户直接与该进程的组件(即活动)交互时,Android 会尽最大努力保持该进程运行,并且您不会看到它在非特殊情况下被终止。

当用户不再直接与进程交互时,相对于其他进程,该进程变得可以牺牲的,详见所引用文档。也就是说,空进程(没有有趣的组件)将被杀死,而包含用户正在使用的活动的进程将被杀死,而具有运行服务的进程将被杀死。因此,具有运行服务的进程将倾向于保留您的进程,而牺牲其他进程。

同时,我们需要很好地处理越来越多的应用程序留下运行的服务,通常是无限期地运行,并且通常存在内存泄漏问题。因此,当服务运行时间越来越长时,Android 将会越来越少地尝试保持其进程运行。实际上,这意味着将其移动到后台存储区,直到内存不足杀手将其消除。在那之后,如果服务仍然想要运行,则会为其创建一个新进程以重新启动。

总的来说,对于长时间运行的正常服务,预期行为是它们的进程在一段时间后将被终止。这不需要停止服务;想要继续运行的服务将会这样做,只需要在一个新进程中实例化即可。

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


谢谢你的有用回答!更具体地说,我从Application进行子类化,并在其中持有对我的Service对象的引用。当我的服务被杀死时,我如何重新获取对新服务的引用?或者我的Application对象也会一起死亡,当它被重新实例化时,一切都与我首次启动应用程序时相同吗? - Erdal
2
当为内存释放某个对象时,整个进程(包括应用程序对象)都会被杀死,在此时不会执行其中的任何代码。如果服务只是因为不再需要运行而被销毁,则会调用其onDestroy()方法,并在稍后需要服务时创建一个新实例并调用onCreate()方法。就个人而言,我通常建议不要使用Application;它并没有比使用静态单例类更多的优势,并且我认为它为人们设置了期望(关于有一个更传统的应用程序模型),这些期望实际上并不存在。 - hackbod
这不需要停止服务;想要继续运行的服务将会这样做,只需要在一个新进程中实例化即可。两个问题:有没有办法告诉进程可能很快被终止,以及如何在新进程中创建新服务? - Spencer Ruport
你无法预测一个进程是否会被终止。如果系统发现需要运行某个服务,但是用于托管该服务的进程不存在,系统将会为其创建一个新的进程。这不在你的控制范围内。 - hackbod
我在一个应用程序中有两个服务(出于特殊原因),我注意到我的进程被杀死并启动了另一个服务(第二个),但我想启动“第一个服务”。 - Chathura Wijesinghe
显示剩余2条评论

4
进程被低内存杀手杀死,而不是应用程序。因此,除非您额外做一些工作将您的服务运行在不同的进程中,否则您的活动将与您的服务一起被杀死。
低内存杀手不会尝试销毁您进程中的任何对象,虽然活动管理器可能会在不再需要的活动对象上调用onDestroy。但这是作为常规活动生命周期的一部分发生的,而不是由于低内存条件。
(顺便说一下,我不清楚您是否指的是一般的“应用程序”,还是扩展应用程序的对象,或者您是否指的是显示UI的活动。)

通过应用程序,我指的是从Application扩展的对象。 - Erdal

0
一个应用程序是具有用户界面的东西,如果您已经将服务包括在其中,那么它肯定会被杀死,因为一旦缓存的应用程序队列变满,应用程序就会终止。
所以要将服务单独创建出来,或者换句话说,为其创建另一个项目 :)
顺便说一下,虽然我不是经验丰富的Android开发人员,但我通过观看Google的Android开发生命周期视频学到了这些。

1
绝对不要创建另一个项目。除非在非常特殊的情况下,也不要让服务在另一个进程中运行(通过android:process)。 - hackbod
是的,我正在尝试将我的服务保持在同一进程中。对我而言,调用静态方法比实现AIDL可能更快、更简单。 - Erdal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接