在Android开发者docs on Services中,我发现了这个相当神秘的说明:
注意:如果您的应用定位到Android 5.0(API级别21),Google建议您使用JobScheduler执行后台服务。
碰巧,API 21正是我的目标,但我应该认真对待这个?我认为绑定服务或启动服务可能最适合我的应用程序,所以这是有关的。可以安排绑定服务吗?文档说服务可以是绑定和启动,但不包括计划。
我是否因未使用预定服务而引发麻烦?我们的想法是使用后台线程通过蓝牙低功耗接收数据缓冲区,并使其可供UI线程使用。创建计划服务的任何特殊问题都可以做到这一点?
另一种选择可能是AsyncTask,但它仅限于运行一次,我担心在不断重新创建它以获取每个数据缓冲区时会产生过多的开销。
答案 0 :(得分:1)
我应该认真对待这个?
简单的解释是,如果您的JobScheduler
为21或更高,则表示在“预定”类别的范围内,请使用minSdkVersion
。这与使用AlarmManager
。
对他们评论的更复杂的解释考虑了他们已经放弃的其他提示,即“开始服务”的概念可能会消失。坦率地说,我看不出他们怎么做到这一点。无论如何,除非还有更多事情要发生,否则我不会特别担心。
可以安排绑定服务吗?
从技术上讲,JobService
是绑定的,但它受操作系统的约束,而不是来自您的其他客户端代码。您可以尝试自己实现onBind()
并链接到超类来处理某些Intent
结构(即来自操作系统的结构),但我不知道它的效果如何。
我是否因未使用预定服务而引发麻烦?
我怀疑任何类型的服务都是合适的。预定的服务是“我想每小时控制一次”,这似乎不适合您的用例。
我们的想法是使用后台线程通过蓝牙低功耗接收数据缓冲区,并将其提供给UI线程。
我推断,通过使用术语“UI线程”,您实际上是指将这些缓冲区用于您的UI。如果您在UI处于前台时只需要此数据,则不需要服务。相反,如果您希望在UI不在前台时收集缓冲区,那么可能需要提供服务。
替代方案可能是AsyncTask,但它仅限于运行一次而且我担心在不断重新创建它以获取每个数据缓冲区时会产生过多的开销。
我没有使用BLE API,但是我希望你需要一个运行时间较长的线程,其中线程阻塞某些蓝牙套接字等待输入。 AsyncTask
不合适,但这并不一定意味着服务。
答案 1 :(得分:0)
JobScheduler实际上是在特定条件下启动服务 - 例如,基于互联网条件的类型,或基于时间。如果条件不正确,它会处理检测这些情况并在将来重试。基本上这是为了给开发人员提供方便和正确 - 许多服务最终自己完成所有这些 - 他们编写自己的警报管理器代码,他们自己的网络检测器,他们自己的重试逻辑等。这将它们组合在一个地方并提供了一个简单的API来使用它。但它仅适用于您希望某些事件(时间,网络连接或内容观察者)触发服务的情况。如果您现在想要运行该服务,则不应该使用它。