在Activity onDestroy中停止服务

时间:2016-02-07 04:51:29

标签: android service

我可以在主Activity的onDestroy方法中安全地停止服务吗?我知道onDestroy不能保证被调用,但我也希望保持我的服务运行,直到应用程序被销毁。

我认为可能在活动被破坏的所有情况下,服务也会被销毁?

2 个答案:

答案 0 :(得分:2)

您可以在活动的onDestroy中停止服务,但要成功执行该操作需要:

Running a Service in the Foreground

  

前台服务是一种被认为是某种东西的服务   用户积极地意识到并因此不是系统的候选者   在内存不足时杀死。前台服务必须提供   状态栏的通知,位于“正在进行”下   标题,这意味着除非通知不能被驳回   该服务要么停止要么从前台删除。

     

例如,从服务播放音乐的音乐播放器应该是   设置为在前台运行,因为用户明确知道   它的运作。状态栏中的通知可能表示   当前歌曲并允许用户发起与之交互的活动   音乐播放器。

或管理Bound Services

  

绑定服务是客户端 - 服务器接口中的服务器。绑定服务允许组件(例如活动)绑定到服务,发送请求,接收响应,甚至执行进程间通信(IPC)。绑定服务通常仅在其服务于另一个应用程序组件时才存在,并且不会无限期地在后台运行

enter image description here

在您的所有活动中,管理您在该活动中创建的所有资源,并使用空检查,关闭它们。就像你在服务类中一样。如果要覆盖父onDestroy,请将自定义代码放在super.onDestroy之前。

more detail about this here

  

但我也想让我的服务一直运行,直到应用程序被销毁。

活动可以在停止状态下保留在堆栈中,并且在需要更多内存之前不会销毁。这意味着在活动被销毁之前,服务将没有固定的时间继续运行。

Activity Lifecycle

  

如果某项活动被另一项活动完全遮挡,则会停止该活动。它仍然保留所有状态和成员信息,但是,它不再对用户可见,因此它的窗口是隐藏的,当其他地方需要内存时,它通常会被系统杀死。

enter image description here

  

活动的整个生命周期发生在第一次调用onCreate(Bundle)到最后一次调用onDestroy()之间。活动将在onCreate()中完成所有“全局”状态设置,并释放onDestroy()中的所有剩余资源。例如,如果它有一个在后台运行的线程从网络下载数据,它可以在onCreate()中创建该线程,然后在onDestroy()中停止该线程。

为了确保清理所有资源,您可以在活动上调用finish(),或者在onStop()方法中结束服务,或者在onStop()中使用计时器,这将结束x时间后服务或销毁活动。

调用finish()的问题是,如果使用快速导航回活动,则需要重新创建它。使用stop()的问题是如果重新启动活动,则需要重新启动服务。因此,计时器可以是保持活动自然状态的一种方式,以允许用户导航,但如果活动在onResume()中恢复,则需要停止计时器。

protected void onDestroy ()

  

在销毁活动之前执行任何最终清理。这可能是因为活动正在完成(有人在其上调用finish(),或者因为系统暂时销毁此活动实例以节省空间。您可以使用isFinishing()方法区分这两种情况。

答案 1 :(得分:1)

是的,在onDestroy中这样做是安全的。因为在杀死您的活动之前,绑定到组件的后台服务或前台服务将被系统杀死,因为在后台运行的服务的优先级低于您正在与之交互的组件。