Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 仅当主应用程序为';t运行_Android_Android Service_Alarmmanager_Intentservice - Fatal编程技术网

Android 仅当主应用程序为';t运行

Android 仅当主应用程序为';t运行,android,android-service,alarmmanager,intentservice,Android,Android Service,Alarmmanager,Intentservice,好的,这里的问题是我有一个摄像头,它通过蓝牙连接到手机上。 所有与设备的通信都是通过android服务进行的。该服务定期使用GPS坐标更新摄像头。不幸的是,这项服务不是我的公司写的,我们只能控制启动它和发送它的命令(但是,如果连接到设备,它自己做GPS)。一旦应用程序启动服务,我们将尝试连接到包含my Companys OUI的任何配对设备。一旦设备断开连接(可能是关机或电池耗尽),在用户重新启动我们的应用程序之前,它不会自动重新连接。因此,在这种情况下,GPS坐标不会发送到摄像机 这是一个问题

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

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

所以我想我可以将AlarmManager与广播接收器或服务(可能是意向服务,因为连接需要几秒钟才能完成)一起使用。也许几分钟后我可以检查一下摄像机的连接。如果有,请退出,如果没有,请尝试连接(如果有配对设备)


然而,问题是如果我的应用程序已经在运行怎么办?如果是,则用户控件将连接到设备(系统会提示用户输入)。我是否需要使用共享首选项或类似的东西来判断我的应用程序是否正在运行/关闭?有没有办法从服务中判断应用程序是否正在运行?我看这会变得很棘手。如果有人知道如何处理,请告诉我。

我建议以下方法:

  • 将警报设置为在X分钟内启动服务
  • 立即为应用程序设置计时器,时间为X-1分钟
  • 应用程序计时器到期时:取消当前设置并为服务设置新警报,为应用程序设置新计时器

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

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

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

    事实证明,只需将状态(忙/不忙)写入共享首选项,并在从alarm manager运行的代码中进行检查,就可以更容易地实现这一点。这是一个额外的状态,我不想保持,但真的不是太难

    我使用Commonware wakeful intent每分钟醒来并执行以下操作:

  • 检查应用程序是否(从共享pref)控制此操作,如果是,请退出
  • 检查蓝牙是否已打开,如果未打开,请退出
  • 绑定到与设备对话的服务,并检查其中一个是否已连接,如果已连接,则退出
  • 如果没有连接设备(但有一个设备配对),则尝试连接
  • 虽然我可能能够优化这一点,但它似乎是有效的,并且是非常防故障的。我知道这对电池来说不太好,但在使用我电池的应用列表中,我仍然看不到我的应用程序(尽管安卓似乎使用了更多)

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

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

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

    我有点困惑这些功能发生在哪里,您能详细说明一下吗?当你们说设置警报在X分钟内启动服务时,这是来自我的应用程序还是在启动时运行的东西?X就是我计划使用的时间间隔(因此,如果只有2分钟,我将其设置为1分钟后开始)。我想我是在我的应用程序中做这件事的,我会把它放在活动中还是我的应用程序类中?我是说你的应用程序。最好从应用程序本身设置,而不是从活动设置,因为在使用应用程序的过程中,您可能会从一个活动切换到另一个活动。当我说X时,我指的是间隔,但不要设置为重复,当它被调用时,重置它。好的,这似乎是有意义的。谢谢。@MattWolfe-我很高兴知道它是否有效(在你完成之后),实际上它有一些问题(但这是个好主意)。主要问题是,在大多数情况下,UI消失后,应用程序会挂起一段时间。相反,我所做的是,当UI处于控制状态时,我将一个共享首选项值设置为true,并在我的服务中检查该值。我还使用Commonware wakeful intent服务来处理确保我的服务运行的细节(通过使用wakelocks)。我会在启动时触发自动连接,当应用程序启动时也会发生。我几乎没有测试过它,但到目前为止它似乎有效。