我对android服务有些困惑 根据文档 它将继续在主线程的后台运行。它不会在不同的线程中运行。
我的疑问是继续在后台运行是什么意思。它会一次又一次地执行onStartCommand()吗?我真的很困惑这条线(继续在后台运行)
如果它不会一次又一次地执行onStartCommand那么Keep运行的好处是什么?如果它一次又一次地执行onStartCommand那么它会越来越多地使用cpu
答案 0 :(得分:1)
正如评论中已经提到的,为了您的特定目的(监控设置,此处:音量),您可以遵循非轮询方法,例如,在这里:Is there a broadcast action for volume changes?
一般来说,在像Android这样的现代(虽然不完美)的环境中,几乎永远不会成为主动民意调查某事的理由,因为没有人能够浪费这么多资源而且,你总是冒险错过事件,所以你很想更频繁地进行投票 - 这是一场你的实施总会失败的种族。
以下语句明白错误:
在您应用的主/用户界面线程上运行Service
。如果您认为是这种情况,那么您需要阅读清单activity
标记的android:process
属性。也。即使您不让服务在单独的进程中运行,服务在您的应用程序的主/ UI线程上运行这一短语表明您的主/ UI线程被您的服务阻止。当然,希望没有人留下那种艺术;在应用程序的主/ UI线程上处理服务事件并将任务委派给工作线程很容易,这是每个理智的实现应该做的事情。
使用START_STICKY
,您可以确保服务在启动后始终运行。当然,这是天真的,意味着声称这一点的人并没有完全理解这个标志的含义以及process lifecylce for Android Services的描述。引用: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会随时使用您正在运行的服务终止该流程,如果它需要内存用于其他具有更高优先级的任务并且您的服务是与用户当前查看的应用程序无关。换句话说,如果系统内存不足并且用户打开需要大部分系统内存的电子表格,那么背景互联网广播媒体播放器和所有花哨的东西可能会被杀死,期间
答案 1 :(得分:0)
服务在您的应用程序的线程上运行,并在启动后继续运行,直到它调用finish()或android需要内存。
但是运行没有必要意味着它正在处理某些事情。只有当有人在您的服务上调用startService()时才会调用onStartCommand()。
所以服务而不是一直运行它总是在内存中准备好在需要时运行。服务的主要用途是进行一些即使你改变活动也能继续运行的处理,比如当你改变活动时继续播放的音乐播放器,寻找下一个音乐。
编辑:在文档“服务不是一个单独的进程....服务不是一个线程。它本身不是从主线程开始工作的手段”。 服务是“应用程序的工具,用于告诉系统它想要在后台执行的操作”
“服务既可以启动也可以绑定绑定。在这种情况下,只要启动服务或者使用Context.BIND_AUTO_CREATE有一个或多个连接,系统就会保持服务运行。一旦这些情况都不成立,就会调用服务的onDestroy()方法,并且服务有效终止。“