使用Alarm Manager启动服务,但仅在主应用程序未运行时使用

时间:2012-04-24 16:15:22

标签: android android-service alarmmanager intentservice

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

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

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

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

2 个答案:

答案 0 :(得分:1)

我建议采用以下方法:

  1. 设置闹钟以在X分钟内开始服务
  2. 立即为应用程序设置计时器X-1分钟
  3. 当应用程序的计时器到期时:取消当前并为服务设置新的警报,并为应用程序设置新的计时器。
  4. 这样,如果应用程序仍在运行,服务将无法启动,一旦应用程序关闭,警报将不会停止。

答案 1 :(得分:1)

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

也许我的问题很糟糕。但是我想要的是阻止我的应用程序在主动打开(或被使用)时尝试重新建立连接。

通过简单地向共享首选项写入状态(忙/不忙)并在我的代码中检查从警报管理器运行,这更容易实现。这是一个额外的状态维持,我不想要,但真的不是太难。

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

  1. 检查应用程序是否正在控制此(来自共享首选项),如果是,则退出
  2. 检查蓝牙是否打开,如果没有,则退出
  3. 绑定到与设备通信的服务并检查是否已连接,如果是,则退出
  4. 如果没有连接设备(但设备已配对),则尝试连接
  5. 虽然我可能能够对它进行一些优化但它看起来很有效并且非常失败。我知道这对电池来说并不好,但我仍然没有在使用我的电池的应用程序列表中看到我的应用程序(虽然android似乎使用更多)。

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

    1. 如果我已经连接,请每分钟停止唤醒服务 直到断开连接。
    2. 禁用蓝牙时停止唤醒服务。重新启用后,再次尝试重新连接每分钟。我相信有一种方法可以在使用意图过滤器启用蓝牙时收到通知。
    3. 为简单起见,我还没有实现这些。