【问题标题】:SyncAdapter to receive chat messages?SyncAdapter 接收聊天消息?
【发布时间】:2020-10-28 23:33:44
【问题描述】:

对于我的聊天应用,我正在寻找一种在应用处于后台时同步消息的好方法。

目前我有一个 websocket。当应用程序进入前台时,消息会同步。这使应用程序看起来很滞后。像 WhatsApp 一样,我需要一种方法在应用程序进入前台之前同步所有消息。

我想到了以下解决方案: 我设置了一个 SyncAdapter,它由推送通知(“聊天 xy 的新消息”)触发。然后在 SyncAdapter 中获取新消息。

现在的问题是我不想为已写入的每一行连接(例如通过 REST)。而且我不想等待 x 分钟来捆绑新消息。

正如我之前所说,我已经有一个 websocket,它会在应用程序进入前台时建立。将此代码移动到 SyncAadapter 是个好主意吗?如果我在 x 分钟内没有收到消息,我可以在那里保持连接打开还是应该关闭它?我看到的唯一问题是,如果用户无法接收推送消息。

如果有人知道著名的聊天应用程序这样做,请指点我这个方向。

【问题讨论】:

    标签: android websocket android-workmanager android-syncadapter android-intentservice


    【解决方案1】:

    Signal (secure messaging app) 是 opensource。您可以看看他们如何实施现实世界的解决方案,目标是实施非常安全的聊天。

    根据您的主要目标,您可以选择一个更简单的实现,其中包含可用的部分。不过我觉得你还是需要几块的:

    1. 有新消息可用时唤醒您的应用程序的推送系统
    2. 当应用处于后台时检索消息的方法
    3. 监控网络并在网络恢复后立即重试发送消息的系统

    第一项可以用Firebase Cloud Messaging (FCM)解决,第二项和第三项可以用WorkManager实现。

    我会避免在设备上保留一些打开连接的东西来检查新消息,主要原因有两个:

    • 电池消耗
    • 背景限制

    【讨论】:

    • 谢谢,但是想象一下有多个用户在聊天,每隔几秒就会换行。如何实施2.?我认为每条消息的休息呼叫会消耗太多电量。
    • 我的第 2 点涵盖了应用程序在后台时的情况。从电池的角度来看,我也不确定让连接始终处于活动状态与对每条消息进行 REST 调用有很大不同。我会做一些测试并使用电池历史学家来检查。但您也可以通过其他方式在用户将应用程序置于前台时保持连接/通信处于活动状态。
    • 您的意思是可以创建一个共享连接,供:前端线程和后台线程(workmanager)使用?
    • 您可以使用自定义的 WorkerFactory 将连接传递给 Worker:medium.com/androiddevelopers/… Hilt 对此也有一些支持:developer.android.com/training/dependency-injection/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多