我可以在主Activity的onDestroy方法中安全地停止服务吗?我知道onDestroy不能保证被调用,但我也希望保持我的服务运行,直到应用程序被销毁。
我认为可能在活动被破坏的所有情况下,服务也会被销毁?
答案 0 :(得分:2)
您可以在活动的onDestroy中停止服务,但要成功执行该操作需要:
Running a Service in the Foreground
前台服务是一种被认为是某种东西的服务 用户积极地意识到并因此不是系统的候选者 在内存不足时杀死。前台服务必须提供 状态栏的通知,位于“正在进行”下 标题,这意味着除非通知不能被驳回 该服务要么停止要么从前台删除。
例如,从服务播放音乐的音乐播放器应该是 设置为在前台运行,因为用户明确知道 它的运作。状态栏中的通知可能表示 当前歌曲并允许用户发起与之交互的活动 音乐播放器。
绑定服务是客户端 - 服务器接口中的服务器。绑定服务允许组件(例如活动)绑定到服务,发送请求,接收响应,甚至执行进程间通信(IPC)。绑定服务通常仅在其服务于另一个应用程序组件时才存在,并且不会无限期地在后台运行
在您的所有活动中,管理您在该活动中创建的所有资源,并使用空检查,关闭它们。就像你在服务类中一样。如果要覆盖父onDestroy,请将自定义代码放在super.onDestroy之前。
但我也想让我的服务一直运行,直到应用程序被销毁。
活动可以在停止状态下保留在堆栈中,并且在需要更多内存之前不会销毁。这意味着在活动被销毁之前,服务将没有固定的时间继续运行。
如果某项活动被另一项活动完全遮挡,则会停止该活动。它仍然保留所有状态和成员信息,但是,它不再对用户可见,因此它的窗口是隐藏的,当其他地方需要内存时,它通常会被系统杀死。
活动的整个生命周期发生在第一次调用onCreate(Bundle)到最后一次调用onDestroy()之间。活动将在onCreate()中完成所有“全局”状态设置,并释放onDestroy()中的所有剩余资源。例如,如果它有一个在后台运行的线程从网络下载数据,它可以在onCreate()中创建该线程,然后在onDestroy()中停止该线程。
为了确保清理所有资源,您可以在活动上调用finish()
,或者在onStop()方法中结束服务,或者在onStop()中使用计时器,这将结束x时间后服务或销毁活动。
调用finish()的问题是,如果使用快速导航回活动,则需要重新创建它。使用stop()的问题是如果重新启动活动,则需要重新启动服务。因此,计时器可以是保持活动自然状态的一种方式,以允许用户导航,但如果活动在onResume()中恢复,则需要停止计时器。
在销毁活动之前执行任何最终清理。这可能是因为活动正在完成(有人在其上调用finish(),或者因为系统暂时销毁此活动实例以节省空间。您可以使用isFinishing()方法区分这两种情况。
答案 1 :(得分:1)
是的,在onDestroy中这样做是安全的。因为在杀死您的活动之前,绑定到组件的后台服务或前台服务将被系统杀死,因为在后台运行的服务的优先级低于您正在与之交互的组件。