通过按后退按钮退出应用程序时,服务不会停止

时间:2017-06-26 13:53:23

标签: android android-service bluetooth-lowenergy android-bluetooth android-service-binding

在我的应用中,服务在后台启动,以处理与BLE设备的BLE通信。我在应用程序启动时有一个Activity(StartActivity)搜索BLE设备,当它找到它时,它启动服务(BleService),将找到的设备交给它,然后绑定到它以接收BleService的广播。 /> BleService建立BLE连接,在不同特征上设置通知程序并读取它们。由于它获得了最初需要的所有信息,因此发送了广播 此广播使StartActivity切换到另一个Activity(MainActivity),然后再次绑定到BleService并对BleService的广播作出反应。
到现在为止还挺好。

当我在MainActivity中按下后退按钮时,应用程序会关闭'。现在,当我重新启动应用程序时(通过单击其图标或在最近的应用程序列表中),应用程序将返回到StartActivity并且无法连接到BLE设备。由于我的BLE设备上的LED不断向我发出信号,它已连接,我认为第一个BleService仍在运行并连接到BLE设备。
我通过向BleService的onDestroy()方法添加一个Log输出来检查这一点,是的,没有调用onDestroy()。当我通过最近的应用列表关闭我的应用时,它被调用。

使用后退按钮关闭应用程序时该怎么办?

编辑:所以我想从我的问题中逐渐解决我的问题:
当我按下MainActivity中的后退按钮关闭我的应用程序,然后通过最近的应用程序列表或再次通过其图标启动它时,我陷入了StartActivity。这是因为StartActivity无法找到BLE设备,因为它仍然连接到仍在运行的BleService。
我怎么能避免这个?

3 个答案:

答案 0 :(得分:1)

即使其父应用程序终止,Android服务仍将继续运行。这是一个重要的功能,即使应用程序崩溃/关闭/被杀,也能执行任何关键操作......

对于您而言,这仅仅意味着您必须在退出应用时关闭服务,至少这是您打算做的事情。这样做非常简单:

stopService(new Intent(ActivityName.this, ServiceClassName.class));

答案 1 :(得分:1)

如果您通过Service启动Context.startService(),则必须通过Context.stopService()或服务本身调用stopSelf()来停止Service。如果绑定是startService()首先启动的方式(例如,不使用{{1}}),则绑定/解除绑定到服务只会停止它。

答案 2 :(得分:1)

我不确定在"返回"已被按下,但您可以查看this answer以帮助您确定服务是否正在运行并采取相应措施。

  

如果您的客户端和服务器代码是同一个.apk的一部分,并且您使用具体的Intent(指定确切服务类的那个)绑定到该服务,那么您可以简单地让您的服务设置为全局变量正在运行,您的客户可以检查。

     

我们故意没有API来检查服务是否正在运行,因为,当您想要执行类似于您的代码中的竞争条件时,几乎没有失败。