随着时间的推移重复使用startService()将命令发送到已启动的服务

时间:2018-04-28 17:30:24

标签: android android-service

我正在开发一款通过BLE(蓝牙低功耗)与嵌入式设备通信的应用。该应用程序允许用户通过活动发送命令。同时应用程序需要在后台发送位置数据。即使活动在一天内关闭并多次打开,也必须不断发送位置数据。

我无法将继续位置更新与命令请求分开。因为所有BLE传输必须由一个队列同步,以防止同时传输,从而导致程序包丢失。

在阅读官方指南(https://developer.android.com/guide/components/services#Basics)后,我的第一个想法是使用前台服务,因为在活动关闭时不得终止服务。这适用于发送位置数据。但是,为了发送命令,我必须在服务启动后与服务进行通信。我读过,建议不要同时使用startService()bindService(),而是选择一种方式。据我所知,当引用上下文(我的情况下的活动)被销毁时,可以销毁绑定服务。所以我觉得绑定到服务对我来说不是一个选择。

与已启动服务对话的另一种方法是使用广播发送命令并在服务中接收它们(sending commands from Activity to Service in android)。

但我认为必须有一个我想念的更好的解决方案。我想到的只是每次我想发送蓝牙命令时都会调用startService()。我想这会奏效。但这是一种好的做法吗?有效的是,在调用startService()之前,我会在一个典型的用例中调用stopService()几十次。

2 个答案:

答案 0 :(得分:1)

哇哇...我读完了整个指南,却在方法文档中忽略了这句话:

startService()

  

对此方法的每次调用都将导致对目标服务的onStartCommand(Intent,int,int)方法的相应调用,其意图在此处给出。 这提供了一种将作业提交到服务的便捷方式,而无需绑定和调用其界面。

https://developer.android.com/reference/android/content/Context#startService(android.content.Intent)

希望如果有人偶然发现它会有所帮助..

答案 1 :(得分:0)

You don't have to bind the service to anything. It's enough to start it and then make sure you call startForeground on it. That will keep your process running without being killed by the system. You don't have to place your BLE code in the service class but can have it wherever you want.