如何从Android中的前台服务正确使用Firebase

时间:2017-01-22 18:31:24

标签: android firebase firebase-realtime-database firebase-authentication

我编写了一个使用firebase匿名身份验证的Android应用程序,并从前台服务写入firebase数据库。当websocket关闭时,我正在使用onDisconnect().removeValue()来清理我的应用程序创建的数据。当用户积极参与应用时,onDisconnect()呼叫会按预期触发(这意味着我的安全规则正常)。但是,当前台服务长时间保持运行时(例如,隔夜,屏幕关闭等),onDisconnect()呼叫永远不会再次触发。应用程序在唤醒时继续运行(与firebase服务器等通信)但是当关闭应用程序时(在一段空闲时间之后),似乎onDisconnect()调用已经以某种方式丢失。

我已经读过firebase SDK每小时都会静默刷新匿名身份验证会话。是否有可能在活动中发生这种情况(并被操作系统杀死,但保持前台服务处于活动状态),从而导致服务器放弃回调到onDisconnect?如果是这样,可以在前台服务中保留此功能吗?

2 个答案:

答案 0 :(得分:0)

Firebase最近有一个错误(不确定它是否已被修复),当它每小时重新验证时,它会丢失onDisconnect(),因为它不再拥有更改该节点的权限。然后这会导致重复。

一些可能的解决方案:

  1. 附上时间戳并检查上一个时间戳是否超过一小时,如果是,则在添加新时间戳时将其删除。

  2. 删除在节点中写入的身份验证要求以跟踪断开连接(但这可能不安全,具体取决于您的需要)。

  3. 以下是一些替代方案,以及Firebase小组成员对问题的更好解释:here

答案 1 :(得分:0)

Android应用程序进程可以无限期地生存。当用户停止使用应用程序时,Android可能会继续使进程保持活动状态,以便在用户返回时加快加载速度。您可以认为这是一种优化,您应该期望有时会发生这种情况。你不应该试图控制这种行为 - 让Android为你管理这个行为。

您的数据库连接未关闭,因为该应用程序仍处于活动状态并且保持与数据库的连接。我建议您在用户停止使用您的应用时跟踪自己,并在此之后的适当时间强制清理,而不要假设Android会杀死您应用的流程。