如何使用长期运行的onDestroy来管理停止服务?

时间:2015-08-11 15:14:47

标签: android android-service

我有一个Android服务类,它有一个长期运行的onDestroy。我需要防止这种情况,因为它可能会在活动正在运行时导致挂起。

似乎有些人很高兴在onDestroy方法中启动一个线程/ AsyncTask来保存长时间运行的代码,尽管我担心线程可能会被杀死。另一种解决方案可能是使用startService而不是stopService,其意图告诉服务启动一个最后调用stopSelf的关闭线程。

这些解决方案中的任何一种都是合理的,还是有其他方式?

2 个答案:

答案 0 :(得分:2)

关闭Intent是一种合理的方式。

然后在onDestroy中启动另一个线程是一个坏主意。当你不期望或不想要它时,它可能被调用或不被调用。

修改:保留重要信息这两种方式都不是一个好主意。 您无法确保在您的进程被终止之前实际运行这些方法。对于非重要数据,您当然可以采用这些方式,但最好在获得数据后立即保留数据,或者至少在固定时间间隔内(如果您有连续的数据输入)。

来自official Documentation

  

注意:不要指望将此方法称为保存数据的地方!例如,如果某个活动正在编辑内容提供程序中的数据,那么这些编辑应该在onPause()或onSaveInstanceState(Bundle)中提交,而不是在此处。

     

此方法通常用于释放与活动相关联的线程之类的资源,以便在其应用程序的其余部分仍在运行时,销毁的活动不会留下这些内容。在某些情况下,系统会简单地杀死活动的托管进程,而不会在其中调用此方法(或任何其他方法),因此它不应该用于执行在进程消失后保留的内容。

此处Documentation专门用于服务:

  

由系统调用以通知服务它已不再使用且正在被删除。该服务应该清理它所拥有的任何资源(线程,注册接收器等)。返回后,将不再有对此Service对象的调用,它实际上已经死了。

(我已经包含了活动文档,因为它更精确)

答案 1 :(得分:1)

您应该知道onDestroy没有绝对保证可以执行。

  

似乎有些人很高兴在onDestroy方法中启动一个线程/ AsyncTask来保存长时间运行的代码,尽管我担心线程可能会被杀死。

我会假设您正在尝试释放某些资源或向服务器发送某种消息。

如果资源没有必要担心 - 如果您开始新线程,它将仅与托管进程(您的应用程序)一起被杀死。如果发生这种情况 - 没关系,系统将为您释放资源。

如果是服务器消息 - 这有点复杂。我喜欢将您的命令发送到Service而不是调用stopService。其他选项是从您的Service开始另一个拆除onDestroy,这将执行长时间运行并自行关闭。