没有主要应用程序可以存在后台服务吗?

Sla*_*zen 12 service android background-service

让我们来看看下一个场景:

  1. 我创建了一个新的Android应用程序,具有应用程序类,活动和后台服务.
  2. static在应用程序类中有一些变量,假设它是一个int i = 0;
  3. 我启动activity,并service从活动开始onCreate(),服务获得START_STICKY标志.
  4. 所有这一切service都是使用TimerTask将当前秒写入应用程序类中的变量.我退出活动
  5. 过了一会儿,Android会终止服务和应用程序(假设设备资源不足),并因为START_STICKY标志而重启服务.

现在我有问题:

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

谢谢,对不起我可怕的英语......

bco*_*rso 8

1.操作系统杀死应用程序时是否存在这种情况,但是不会终止服务?

tl;博士:是的,这是可能的.但是,Service必须从它自己的过程开始.

阐释:

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

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

现在考虑单独进程的情况ServiceApplication现有情况.在Android中,进程在低内存情况下从最低优先级到最高优先级被破坏.优先顺序为:空<背景<服务<可见<前景(见此处).因此,您可能Application会在您Service活着期间被销毁(例如,如果您的应用程序在后台),Service并且您的应用程序在您的应用程序保持活动状态时也可能会被销毁(应用程序位于前台).

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

流程的官方文档:

默认情况下,同一应用程序的所有组件都在同一进程中运行,大多数应用程序不应更改此设置.然而,[...]对于每种类型的构成要素的清单项- ,Activity,Service,ReceiverProvider-支持一个android:process能够指定在其中该组件应运行的处理属性.您可以设置此属性,以便每个组件在其自己的进程中运行,或者使某些组件共享进程,而其他组件则不共享.[...]该Application元素还支持android:process属性,用于设置适用于所有组件的默认值.


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

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

如果Service存在于Application与之相同的进程中,则它们将被销毁并一起重新启动.

如果Service存在于一个单独的进程中,Application则它们是完全独立的进程,因此将在Android OS认为合适的情况下相互独立地销毁和重新启动.