2012-11-05 50 views
1

我有一个问题与系统停止时Android服务的行为有关。根据我的理解,如果系统(OS)由于需要资源而停止服务,系统有责任重新启动它。在这种情况下,系统不会在停止服务时调用onDestroy(),并在启动服务时调用onCreate(),而只会调用onStartCommand()。安卓服务如何在系统停止时作出响应

如果我在onStartCommand()中创建线程,当系统停止服务时如何清理线程。如果我不停止线程,onStartCommand()会创建一个新的线程。 我认为,它可能会降低到onStartCommand()参数(intent,flags和startId)。系统在停止服务后启动服务时可能会有所不同,因为它需要资源。任何人都可以告诉我,当通过startService()命令或系统本身(停止后)启动服务时参数会有什么不同

我可以在onCreate()中创建线程,但我不确定线程​​在系统停止服务。处理这种情况的最佳方式是什么?

感谢

回答

2

按我的理解,如果系统(OS)停止了服务,由于所需要的资源,它是系统的责任再次启动它。

这取决于您从onStartCommand()返回的内容。例如,START_NOT_STICKY意味着操作系统不必再次启动您的服务。

在这种情况下,系统不会在启动服务时停止服务和onCreate()时调用onDestroy(),而只会调用onStartCommand()。

它是否调用onDestroy()取决于服务停止方式(如直接或通过进程终止)。但是,如果操作系统重新启动服务,它仍应在新实例上调用onCreate()

如果我在onStartCommand()中创建一个线程,我将如何在系统停止服务时清理线程。

确保在onDestroy()中发生了会导致线程消失的事情。 onDestroy()将被调用(并且您的服务可以执行清理),或者您的进程正在终止(并且您的线程会随之消失)。

谁能告诉我这将是在当服务由startService()命令或由系统本身启动(停止之后)的参数差异

有一个START_FLAG_REDELIVERY,将在传递的标志到onStartCommand(),但AFAIK只有在您从onStartCommand()返回START_REDELIVER_INTENT时才会设置。

+0

感谢CommonsWare。所以,你说系统总是会调用onCreate(),而不管服务是如何停止的。不幸的是,当系统停止服务但没有调用onDestroy()或onCreate()并直接调用onStartCommand()时,我看到了实例(通过日志记录)。我将如何处理这些情况? – Androidme

+0

@bsengar:“不幸的是,当系统停止服务但没有调用onDestroy()或onCreate()并直接调用onStartCommand()时,我看到了实例(通过日志记录)” - 欢迎您提供示例应用程序和步骤用于再现证明这种行为的问题。 – CommonsWare

+0

您可以通过编写示例服务并登录onCreate(),onStartCommand()和onDestroy()来轻松测试它。在启动时启动服务。大约10小时后(或者更多)检查服务状态,可能会说服务运行了2个小时。但是,如果您检查日志文件,则不会看到任何onDestroy()或onCreate()调用,而只是额外的onStartCommand()调用。 – Androidme