1

好的,这里的问题是我有一个通过蓝牙连接到手机的摄像机。与设备的所有通信都是通过 android 服务进行的。该服务会定期使用 GPS 坐标更新相机。不幸的是,该服务不是由我的公司编写的,我们只能控制它的启动和发送命令(但是,如果连接到设备,它会自行执行 GPS)。一旦我们的应用程序启动了服务,我们就会尝试连接到任何包含我公司 OUI 的配对设备。一旦设备断开连接(可能是关闭或电池耗尽),它不会自动重新连接,直到用户重新启动我们的应用程序。因此,在这种情况下,GPS 坐标不会被发送到相机。

这是一个问题,因为用户(对这些服务一无所知,什么都不知道)会认为如果他重新打开设备,它应该被连接。

所以我想我可以将 AlarmManager 与广播接收器或服务一起使用(可能是意图服务,因为连接需要几秒钟才能完成)。也许每隔几分钟我可以检查一次与相机的连接。如果它的存在只是退出,并且如果没有尝试连接(如果有配对的设备)。

但是问题是如果我的应用程序已经在运行怎么办?如果是,则用户控制连接到设备(提示他们)。我是否需要使用共享首选项或类似的东西来判断我的应用程序是否正在运行/关闭?有什么方法可以从服务中判断应用程序是否正在运行?我可以看到这变得棘手。如果有人知道如何处理这个问题,请告诉我。

4

2 回答 2

1

我会建议以下方法:

  1. 设置警报以在 X 分钟内启动服务
  2. 立即为应用程序设置计时器 X-1 分钟
  3. 当应用的定时器到时:取消当前并为服务设置新的闹钟,为应用设置新的定时器。

这样,如果应用程序仍在运行,服务将不会启动,并且一旦应用程序关闭,警报也不会停止。

于 2012-04-24T16:19:43.253 回答
1

Binyamin Sharet 的回答很好,但不幸的是它并没有解决我的问题,因为当应用程序不再可见或正在使用时,它可能仍在运行,并且应用程序需要很长时间才能真正关闭。另一件需要注意的是,当您的服务/侦听器或任何其他组件启动时,它将实例化您的 Application 类,这会使事情变得棘手。

也许我的问题措辞不佳。但是,我想要的是防止我的应用程序在它主动打开(或正在使用)时尝试重新建立连接。

事实证明,只需将状态(忙/不忙)写入共享首选项并在我从警报管理器运行的代码中检查它就更容易完成。这是一个我不想要的额外状态,但实际上并不太难。

我使用 commonsware 唤醒意图每分钟醒来并执行以下操作:

  1. 检查应用程序是否正在控制它(来自共享首选项),如果是,则退出
  2. 检查蓝牙是否开启,如果没有退出
  3. 绑定到与设备对话的服务并检查是否已经连接,如果是则退出
  4. 如果没有连接设备(但有设备配对),则尝试连接

虽然我可能能够优化它,但它似乎可以工作并且非常有效。我知道这对电池来说不是很好,但我仍然没有在使用我的电池的应用程序列表中看到我的应用程序(尽管 android 似乎使用更多)。

我能想到的唯一真正的改进是:

  1. 如果我已经连接,请停止每分钟唤醒服务,直到它断开连接。
  2. 当蓝牙被禁用时停止唤醒服务。重新启用后,开始尝试再次每分钟重新连接。我相信有一种方法可以通过使用意图过滤器启用蓝牙时得到通知。

为简单起见,我还没有实现这些。

于 2012-04-30T23:22:38.967 回答