一个后台服务能否在没有其主要应用程序的情况下存在?

13
让我们来看下一个场景:
  1. 我创建了一个新的Android应用程序,其中包含一个应用程序类、活动和后台服务。
  2. 在应用程序类中有一些静态变量,假设它是一个 int i = 0;
  3. 在活动的 onCreate() 中启动服务,并使用 START_STICKY 标志,该服务使用 TimerTask 将当前秒数写入应用程序类中的变量。
  4. 退出活动。
  5. 过一段时间,当 Android 杀死服务时,由于 START_STICKY 标志,将重新启动服务和应用程序(假设设备资源不足)。
现在我有两个问题:
  1. 当操作系统杀死应用程序但不杀死服务时,会发生什么情况?
  2. 当系统重新启动服务时,应用程序是否也会重新启动? 如果是,它会具有哪个上下文?如果不是,那么没有应用程序情况下运行服务是如何实现的?
谢谢,对我的糟糕英语感到抱歉...
3个回答

8

1. 操作系统会杀死应用程序但不会杀死服务的情况是否存在?

简而言之:是的,这是可能的。但是,Service必须在自己的进程中启动。

解释:

重要的是要认识到,在Android操作系统运行内存不足时,它会关闭进程,而不是个别组件,例如ActivitiesServices(请参见此答案)。

基于上述说明,只有当它们包含在单独的进程中时,Service才能独立于Application存在。否则,它们将在其进程被销毁时一起被销毁。

现在考虑ServiceApplication分别存在于不同进程的情况。在Android中,进程在低内存情况下按从低到高的优先级销毁。优先级顺序是:空闲 < 后台 < 服务 < 可见 < 前台(请参阅这里)。因此,当应用程序在后台时,可能会销毁您的Application,同时您的Service仍然存活;同样地,当应用程序在前台时,可能会销毁您的Service,但是您的Application仍然存在。

您可以通过在组件清单标记中定义android:process属性来声明应用程序的任何组件(Activity、Service、ContentProvider等)在自己的进程中运行。

来自进程的官方文档:

默认情况下,同一应用程序的所有组件都在同一进程中运行,大多数应用程序不应更改此设置。但是,[...]每种类型的组件元素的清单条目——ActivityServiceReceiverProvider——支持一个android:process属性,该属性可以指定该组件应在其中运行的进程。您可以设置此属性,以便每个组件在其自己的进程中运行,或者使某些组件共享一个进程,而其他组件则不会。[...]Application元素还支持android:process属性,以设置适用于所有组件的默认值。


2. 当系统重新启动服务时,应用程序是否也会重新启动?

这与问题1中的答案有关。

如果ServiceApplication在同一个进程中,则它们将同时被销毁并重新启动。
如果Service存在于与Application不同的进程中,则它们是完全独立的进程,因此将由Android操作系统独立地决定何时销毁和重新启动。

1

Tomer Mor的答案是不正确的。

当你的Application关闭时,你的Service也会关闭。

你的Service只会在你的Application之后被创建。 你可以通过记录它们的onCreate()来观察到这一点。


1

操作系统会杀死应用程序但不会杀死服务的情况是否存在?

是的,这样的情况通常发生在服务需要最后一些资源时才会被杀死,而应用程序则在服务之后被杀死。详情请查看此处文档

当系统重启服务时,应用程序会重新启动吗?

我不太确定,但我认为不会,因为服务可以在没有应用程序引用的情况下运行。


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