当前位置: 首页 > 知识库问答 >
问题:

在活动onDestroy中停止服务

穆招
2023-03-14

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

我在想,也许在所有活动被破坏的情况下,服务也会被破坏?

共有2个答案

唐修能
2023-03-14

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

卢树
2023-03-14

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

在前台运行服务

前台服务是一种被认为是用户主动意识到的服务,因此在内存不足时不是系统要杀死的候选服务。前台服务必须为状态栏提供通知,该状态栏位于“正在进行”标题下,这意味着除非服务停止或从前台删除,否则无法取消通知。

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

或管理绑定服务

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

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

这里有更多的细节。

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

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

活动生命周期

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

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

为了确保您的所有资源都被清理干净,您可以在活动上调用完成(),或者在onStop()方法中结束服务,或者在onStop()中使用计时器,在之后结束服务或销毁活动x时间。

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

对于受保护的空onDestroy()

在活动被销毁之前执行任何最终清理。这可能是因为活动正在完成(有人在它上面调用了完成()),或者是因为系统正在临时销毁活动的这个实例以节省空间。可以使用isFinish()方法区分这两种方案。

 类似资料:
  • 我有一个ArrayList,它应该在包含0个以上对象时启动报警服务,在包含0个对象时停止报警服务。 这是报警服务类。 这是on Receive方法广播接收器类 问题是,即使调用了报警服务的onDestroy方法,通知也不会停止。 我错过什么了吗? 谢谢

  • 问题内容: 在这里,我尝试了简单的服务程序。启动服务可以正常工作并生成Toast,但停止服务则不能。此简单服务的代码如下: 调用此服务的活动的代码如下: 使用该停止按钮帮助我停止服务,该按钮在onDestroy()方法中生成吐司。我已经在这里看到了很多有关停止服务问题的帖子,但并不令人满意,因此发布了新问题。希望得到满意的答复。 问题答案: 是错误的名字 您是否仅在此问题或代码中犯了错误?

  • 问题内容: 我目前有一项使用以下活动在活动的onCreate方法中启动的服务: 现在,我需要能够在按下按钮时停止该服务,并在再次按下按钮时再次重新启动它,但是我不确定如何停止该服务并在onCreate方法之外重新启动它。 我想我需要以不同于当前正在执行的方式启动该服务?但是我不确定最好的方法。 我曾在android中查看过stop服务,但是他们启动服务的方法似乎在onCreate中不起作用。 我的

  • 问题内容: 我有一个问题,提交表单时所有活动的ajax请求均失败,并触发错误事件。 如何在不触发错误事件的情况下停止jQuery中所有活动的ajax请求? 问题答案: 每次创建ajax请求时,都可以使用变量来存储它: 然后,您可以中止请求: 您可以使用数组来跟踪所有未决的ajax请求,并在必要时中止它们。

  • 我正在处理活动识别API,试图使其在后台运行。因此,我创建了一个连接到Play Services的服务,并且一直处于活动状态。当服务被销毁并重新创建时,我要干杯了。问题是,一段时间后,即使服务正在运行,它也会停止检测活动。 下面是该服务的一些代码。 我还覆盖了onConnectionSuspend 这段代码正常工作了一段时间,然后突然停止了。有人知道为什么吗? 谢谢。

  • 问题内容: 我已经到了秃顶几步之遥… 我正在尝试运行一项服务,该服务将检查我工作中的服务器是否正在运行。应该每5分钟执行一次。 我经历过TimerTask,ScheduledExecutorService,最后是Handler。他们都工作了好几个小时,除了一些不准确的地方外,还有1-5分钟的时间,然后突然,“计时器”就停止了发射。 现在,我已经了解到,如果Scheduler遇到未捕获的异常,它将停