2010-06-15 179 views
14

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

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

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

谢谢!

回答

35

看Android开发生命周期的视频首先请务必阅读:http://developer.android.com/guide/components/processes-and-threads.html#Lifecycle

这里的关键是,在Android的过程就是对代码的容器 - - 或者特别是一个或多个组件(活动,服务,接收者,提供者)。默认情况下,.apk中的所有组件都有自己的专用进程,它们都一起运行。这几乎总是你想要的。

当用户直接与该进程的一个组件(即一个活动)进行交互时,Android会尽力保持该进程的运行,除非出现特殊情况,否则不会看到它被杀死。

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

与此同时,我们需要处理越来越多的应用程序,这些应用程序经常无限期地运行,并且经常伴随着内存泄漏。因此,服务运行的时间越来越长,Android将越来越难以保持其流程的持续进行。实际上,这意味着将其移动到后台存储桶中,直到内存不足杀手将其取出。之后,如果服务仍然需要运行,那么将会创建一个新进程以供其重新启动。

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

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

+0

感谢您的有用答案! 所以要更具体一点:我从应用程序的子类,并在其中我持有对我的服务对象的引用。当我的服务遇害时,我怎样才能得到一个新的参考?还是我的应用程序对象也死了,当它被重新实例化时,所有内容都与我第一次启动应用程序时相同? – Erdal 2010-06-15 18:44:51

+2

当为内存杀死某些东西时,此时整个进程(包括应用程序对象)被终止并且没有执行任何代码。 如果服务因为不再需要运行而被销毁,它的onDestroy()将被调用,并且在稍后需要该服务时,会创建一个新实例并调用onCreate()。 我个人一般建议不要使用应用程序;它只是使用静态单例类并不真正给你任何东西,而且我认为对人们的期望(w.r.t.存在更传统的应用程序模型)并不真正成立。 – hackbod 2010-06-16 01:41:30

+0

我明白你的意思了。我唯一的问题,迫使我使用应用程序类,我不想从我所有的不同的活动绑定到服务。我只在我的应用程序的onCreate方法中调用绑定,然后所有其他活动通过我的应用程序单例访问该服务。你会提出更好的建议吗? – Erdal 2010-06-16 21:44:14

3

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

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

(顺便说一句,我不清楚是否意味着“应用程序”一般,或你的对象扩展应用程序,还是你的意思是你的活动,展示了UI)。

+0

由应用程序我的意思是我的对象,从应用程序 – Erdal 2010-06-15 19:16:35

1

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

因此创建与应用程序分开的服务或换句话说创建其他项目为它:)

顺便说一句,我不是一个有经验的Android德veloper但多数民众赞成我想我学会了用谷歌

+1

延伸绝对不会创建另一个项目。除非在特殊情况下,否则不要在另一个进程中运行服务(通过android:进程)。 – hackbod 2010-06-15 08:30:33

+0

是的,我正在努力让我的服务保持在同一个过程中。对我来说,调用静态方法可能会更快,更容易,而不是实施aidl – Erdal 2010-06-15 18:31:25