我目前正在开发一个 Android 电话应用程序,其中包括一个服务来处理所有用于拨打和接听电话的 SIP 信令。
我希望此服务在用户正确登录应用程序时独占启动。但是,我观察到一个不受欢迎的行为:如果在应用程序运行时关闭设备,则服务会在手机启动后自动启动。如果在关闭手机时关闭应用程序,则不会发生这种情况。
我一直在阅读它,但没有答案出现。谁能解释为什么会发生这种情况以及如何防止它?
先感谢您。
感谢 CommonsWare 评论,我很快找到了答案:
[...] 服务启动的唯一方式是有人启动它,而操作系统不会自行启动。
以为操作系统对此负责,我感到非常盲目,以至于我没有注意到它是故意完成的,因为它是从该应用程序的先前版本继承的未记录功能。
有一个 BroadcastReceiver 正在监听 android.intent.action.BOOT_COMPLETED 动作。除其他外,该接收器在应用程序未正确关闭时在启动时重新启动服务。
感谢 CommonsWare 的帮助。
更新
在阻止 BroadcastReceiver 监听 BOOT_COMPLETE 操作后,我仍然遇到相同的行为。
原因是此 BroadcastReceiver 也在监听连接变化以在 WIFI 或数据连接变为活动状态时重新启动 SIP 服务,仅在应用程序运行时。应用程序是否关闭存储在应用程序首选项中,但是当应用程序运行时手机关闭时,此值未正确设置。
这就是为什么该服务仍然在启动时意外启动的原因:因为 BroadcastReceiver 在启动时检测到一个 android.net.conn.CONNECTIVITY_CHANGE 并且告诉应用程序是否仍在运行或已退出的首选项没有正确更新。