13

让我们检查下一个场景:

  1. 我创建了一个新的 android 应用程序,其中包含应用程序类、活动和后台服务。
  2. static在应用程序类中有一些变量,可以说它是 int i = 0;
  3. 我启动activity,并service从活动启动onCreate(),服务获得START_STICKY标志。
  4. 所做service的只是使用 TimerTask 将当前秒写入应用程序类中的变量。5.我退出活动
  5. 一段时间后,Android 将终止服务和应用程序(假设设备资源不足),并因为START_STICKY标志而重新启动服务。

现在我必须提出问题:

  1. 操作系统杀死应用程序但不杀死服务的情况是什么?
  2. 当服务被系统重新启动时,应用程序是否也会重新启动?如果是 - 它将有哪个上下文,如果没有,怎么可能有一个服务在没有他的应用程序的情况下运行?

谢谢,对不起我糟糕的英语......

4

3 回答 3

8

1. 是否存在OS kill 的应用程序,但没有kill 服务的情况?

tl;博士:是的,这是可能的。但是,Service必须在它自己的进程中启动。

解释:

重要的是要意识到 Android 操作系统会在内存不足时杀死进程,而不是单个组件,例如ActivitiesServices请参阅此答案)。

鉴于上述陈述,很明显,只有当它们包含在单独的进程中时,aService才能独立于 the 存在。Application否则,当它们的进程被销毁时,它们将一起被销毁。

现在考虑单独进程上的Service和存在的情况。Application在 Android 中,进程在内存不足的情况下从最低优先级到最高优先级被销毁。优先顺序是:空 < 背景 < 服务 < 可见 < 前景见这里)。因此,您可能会在您还活着的时候Application被销毁(例如,如果您的应用程序在后台),也可能在您的应用程序还活着的时候被销毁(应用程序在前台)。ServiceService

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

来自Processes的官方文档:

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


2. 服务被系统重启后,应用也会重启吗?

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

If the Service exists in the same process as the Application then they will both be destroyed and restarted together.

If the Service exists in a separate process as the Application then they are completely separate processes, and therefore will be destroyed and restarted independent of each other as the Android OS deems appropriate.

于 2015-07-10T20:48:13.193 回答
1

操作系统会杀死应用程序但不会杀死服务的情况吗?

是的,有这种情况,通常服务会在活动后终止,因为它们需要系统的最后资源阅读此处的文档

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

对此不确定,但我认为不可以,因为没有应用程序引用,服务也可以生存

于 2013-03-07T09:53:59.720 回答
1

Tomer Mor 的回答是不正确的。

当你Application死了——你Service的也死了。

Service的 s 将仅在您的Application. 您可以通过记录他们的onCreate().

于 2013-03-13T09:06:12.760 回答