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

时间:2013-03-07 09:48:34

标签: android service background-service

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

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

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

3 个答案:

答案 0 :(得分:7)

1。操作系统杀死应用程序时是否存在这种情况,但是没有杀死该服务?

tl; dr:是的,这是可能的。但是,<?php // Database Connection include "connection.php"; //Connect to Database // Fetch Record from Database $output = ""; $sql = mysql_query("select '$select' from'$from' where'$where'" $columns_total = mysql_num_fields($sql); // Get The Field Name for ($i = 0; $i < $columns_total; $i++) { $heading = mysql_field_name($sql, $i); $output .= '"'.$heading.'",'; } $output .="\n"; // Get Records from the table while ($row = mysql_fetch_array($sql)) { for ($i = 0; $i < $columns_total; $i++) { $output .='"'.$row["$i"].'",'; } $output .="\n"; } // Download the file $filename = "file.csv"; header('Content-type: application/csv'); header('Content-Disposition: attachment; filename='.$filename); exit; ?> 必须在其自己的流程中启动。

阐释:

重要的是要意识到Android操作系统在内存不足时会杀死进程,而不是单个组件,例如{{ 1}}或Servicesee this answer)。

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

现在考虑单独进程中存在ApplicationService的情况。在Android中,进程在低内存情况下从最低优先级到最高优先级被破坏。优先顺序为:清空&lt;背景&lt;服务&lt;可见&lt;前景see here)。因此,当Application保持活着时(例如,如果您的应用程序在后台),您的Application可能会被销毁,并且您的{{1}也可能当你的应用程序保持活动状态时应用程序将被销毁(应用程序位于前台)。

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

来自Processes的官方文档:

  

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

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

这与问题1的答案有关。

如果android:process存在于与Application相同的过程中,那么它们将被销毁并重新启动。

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

答案 1 :(得分:2)

  

操作系统是否会杀死应用程序,但不会杀死该应用程序   服务?

是的,有这样的情况,一般服务会在活动后被杀死,因为他们需要系统中的最后资源阅读Docs here

  

当系统重新启动服务时,将是应用程序   重新开始?

我不确定,但我认为没有,因为服务可以在没有应用程序参考的情况下生存

答案 2 :(得分:1)

Tomer Mor的答案不正确。

Application死亡时,您的Service也会死亡。

您的Service只会在Application之后创建。 您可以通过记录他们的onCreate()来观察自己。