1

我对 android 服务有些困惑根据文档,它将继续在主线程的后台运行。它不在不同的线程中运行。

我的疑问是继续在后台运行是什么意思。它会一次又一次地执行 onStartCommand() 吗?我对这条线真的很困惑(继续在后台运行)

如果它不会一次又一次地执行onStartCommand,那么继续运行有什么好处,如果它一次又一次地执行onStartCommand,那么它会越来越多地使用cpu

让我感到困惑的线在图像中突出显示,请看一下 在此处输入图像描述

4

2 回答 2

1

正如评论中已经指出的那样,对于您的特定目的(监控设置,此处:音量),您可以遵循此处描述的非轮询方法:是否有针对音量更改的广播操作?

一般来说,在像 Android 这样的现代(虽然不完美)环境中,几乎没有理由主动投票,因为没有人能承受浪费这么多资源,而且,你总是有错过事件的风险,所以你会想要更频繁地进行轮询——这是一场你的实现总是会失败的竞赛。

再一次,以下陈述是完全错误的:

  • AService在您的应用程序的主/UI 线程上运行。如果您认为是这种情况,那么您需要阅读android:process清单activity标签的属性。还。即使您不让服务在单独的进程中运行,服务在应用程序的主/UI 线程上运行的短语也表明您的主/UI 线程被您的服务阻塞。当然,希望没有人离开 iot 艺术;在应用程序的主/UI 线程上处理服务事件并将任务委托给工作线程很容易,这是每个理智的实现都应该做的。

  • 使用START_STICKY,您可以确保您的服务在启动后始终运行。当然,这是幼稚的,并且意味着无论谁声称这都没有完全理解这个标志的含义以及Android Services 的进程生命周期的描述。引用:如果您阅读该部分,您将知道如果 Android 需要内存用于另一个具有更高优先级的任务并且您的服务与用户的应用程序无关Note this means that most of the time your service is running, it may be killed by the system if it is under heavy memory pressure.,Android 将随时终止您正在运行的服务的进程,恕不另行通知目前看。换句话说,如果系统内存不足并且用户打开了一个需要大部分系统内存的电子表格,那么后台网络广播媒体播放器和所有花​​哨的东西很可能会被杀死,期间。

于 2013-02-03T11:33:15.373 回答
0

服务在您的应用程序的线程上运行,并在启动后一直运行,直到它调用 finish() 或 android 需要内存。

但是运行并不一定意味着它正在处理某些东西。仅当有人在您的服务上调用 startService() 时才会调用 onStartCommand()。

因此,服务不是一直运行,而是始终在内存中准备好在需要时运行。服务的主要用途是做一些处理,即使你改变了活动,它也会继续运行,比如一个音乐播放器,当你改变活动寻找下一个要播放的音乐时,它会继续播放。

编辑:关于文档“服务不是一个单独的进程......服务不是一个线程。它本身不是一种从主线程中完成工作的手段”。服务是“应用程序告诉系统它想要在后台执行的操作的工具”

“一个服务既可以启动,也可以绑定连接。在这种情况下,只要服务启动或者有一个或多个使用 Context.BIND_AUTO_CREATE 标志的连接,系统就会保持服务运行。一旦这些情况都不成立,服务的 onDestroy() 方法被调用并且服务被有效地终止。”

服务文档

于 2013-02-01T11:33:45.710 回答