【问题标题】:Firebase onDisconnected called when closing the app by swiping it out通过刷出关闭应用程序时调用 Firebase onDisconnected
【发布时间】:2017-01-12 10:27:49
【问题描述】:

我有一个使用 Firebase 的应用。

Firebase 的记录包含一个“状态”字段,该字段应该在用户离线或在线时提供信息。

我是这样初始化的:

fireBase = new Firebase("https://myProj.firebaseio.com/users");
child = fireBase.child(MyApp.myStringIdentifier);
child.child("status").setValue(ClientStatus.ONLINE);
child.child("status").onDisconnect().setValue(ClientStatus.OFFLINE);

初始化工作正常,并且在很长一段时间没有互联网连接后也会调用onDisconnect(),并且firebase确实按预期将状态更改为离线。

问题是onDisconnect 事件在用户从最近的应用程序列表中刷出应用程序时也会被调用,但我希望用户保持在线,因为我的服务仍在后台运行,应该处理即使应用程序关闭时也会发生一些事件(它们仍在运行,但其他用户获得关闭用户的离线状态,然后对该用户的操作被阻止)。

有没有办法防止在用户刷出应用时调用onDisconnect 事件?

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    您的 Firebase 数据库客户端的 onDisconnect 处理程序被调用:

    1. 当数据库客户端主动断开与 Firebase 服务器的连接时
    2. 当服务器检测到数据库客户端消失时(通过套接字连接超时)

    请注意,这些都与您的应用程序生命周期无关,这似乎是您感兴趣的。

    如果您想在应用程序被销毁时更改数据库,您可能应该将应用程序生命周期事件监听到detect when the application exits

    【讨论】:

    • 我需要一种方法来了解由于您所写内容的原因 1 或原因 2 而断开连接之间的区别。原因 2 我将假设用户根本没有互联网连接,但原因 1我想假设该应用程序已被终止,但仍有服务可以处理传入事件。
    • 是否有可能知道调用 onDisconnect 事件的原因(你写的 1 或 2 个)?
    • 没有办法知道断开事件是针对活动断开还是套接字超时触发。您可以依赖的只是客户端已断开连接。
    【解决方案2】:

    当 Android 设备的用户使用概览显示“滑动”某个应用时,这表明他们不想再使用该应用,并且他们也没有兴趣随时返回该应用很快。 Android 将终止应用程序进程。终止应用程序进程将关闭它与您的实时数据库的连接。关闭连接将导致 onDisconnect() 在服务器上执行。当用户做出决定时,您无法控制此过程。这是由 Android 平台设计的,它允许用户对可以在他们的设备上实际运行的内容做出最终决定。作为应用开发者,您无权就此事强加自己的决定。

    如果您想在应用已被用户杀死的情况下向其发送消息,您可以改为使用Firebase Cloud Messaging 来传递用户表示感兴趣的事件。

    【讨论】:

    • 问题不在于发送消息,而在于让其他用户知道您在线。每个客户端都反复从 firebase 获取所有其他客户端的状态,然后他们认为刷掉的用户处于离线状态,即使他获得了可以处理来自他的事件的服务。
    • 您可能想问一个新问题,即您对用户“在线”意味着什么的具体要求的实施,无论您以何种方式定义(我不清楚,而Android也没有定义这个)。如果您尝试根据设备的网络连接来定义它,那么您的应用将无法真正依赖于较新设备上的连接。您的应用进程根本无法一直运行。
    猜你喜欢
    • 2017-11-08
    • 2017-02-19
    • 2022-01-13
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多