Android - 全球跟踪看不见的通知,最佳做法

时间:2015-07-24 12:35:16

标签: android sockets android-activity android-service read-unread

在Android中,我有一个套接字保持与服务器的实时通信。 此应用程序套接字由服务控制,该服务在启动时和/或应用程序发出请求时启动。

因为我不能依赖Google PlayStore,所以我完全控制手动发送+接收推送消息。

每当从服务器到达新的推送消息时,套接字服务发送本地广播消息,并且监听活动可以遵循自己的动作。如果没有找到活动,则向用户提供默认的android通知,说'[ap]你有{n}个新消息......

这有其稳定性问题(例如,当内存不足时,操作系统可以关闭服务)但是没关系。

现在,请考虑以下事项:

我有多个侦听的活动,并显示未读消息的数量。

  • 主页
  • ConversationsOverviewPage
  • '对话页面(聊天页)

每个活动都可以在前台,但也可以在内存中用于当用户反压并返回1个活动时。因此,在理论上,您可能希望一次更新不同/多个活动。这可以防止在用户返回“savedInstance”时不得不从服务器“重新加载”未读消息。所以我认为广播模式效果最佳。

保持全局跟踪未读消息的最佳做法是什么,同时最大限度地减少每个活动实例上的服务器行程:

  1. 非常简单:在每个活动实例上发出服务器请求,并为每个活动再次编写更新代码。 但是会导致用户看到延迟,因为在应用从服务器接收数据并显示“未读消息”气球之前需要一秒钟。
  2. Simpel :拥有一个全局类..保留每个会话的未读消息,但是我觉得这会导致数据不完整的问题。特别是当应用程序没有“活跃”时

  3. 我的旧投票:有另一项服务跟踪未读消息,这些消息在启动时启动(就像套接字一样)..只有当服务启动/启动时,它才会请求来自服务器的所有未读消息数据。每个活动都可以“询问”未读消息数据,而不必再担心它。 这可能有点矫枉过正?

  4. 我的新投票:保留套接字服务,并为此服务添加一个单独的类。这包含未读数据.. 但是这个也觉得不对。因为活动必须要求服务超出范围..它不是管理未读消息(关注点分离)的套接字,对吗?

  5. 非常感谢有经验的开发人员!

1 个答案:

答案 0 :(得分:1)

第三个选项没问题。不确定overkill到底在哪里。显然,你不应该在每次启动或套接字重新连接时下载所有未读消息。最重要的经验法则是在应用程序真正需要时加载数据。关于我对同一个应用程序的开发方式很少:

  • 有套接字Service,用于处理连接,断开连接,发送数据(消息)和接收数据。
  • Notification manager来自SocketService的活动。它保存来自服务器的新数据并决定应该发送哪个广播通知。
  • 连接套接字时,它从服务器接收状态数据:
    1. 每次聊天的最后更新日期(时间戳)。例如,如果本地数据库包含昨天更新的聊天A但是新收到的服务器数据表明聊天A在几秒钟前更新了,则需要广播chat A has been updated since last connection之类的事件并保存更新日期。如果有任何活动以某种方式显示聊天A,则会加载(通过http或其他任何)新数据。
    2. 每次聊天都
    3. last messages。该应用只比较本地保存的last messages和新收到的。如果有新的应用程序再次播放像there is unread message/messages from user x这样的事件。如果有可见活动显示更新的聊天,则会更新数据,否则应用会显示通知。

因此,接下来处理未读消息的基本流程是:连接到服务器>检查是否有关于未读消息的数据>将新数据保存到本地数据库>广播事件关于新数据。

我建议您同时使用GCM和套接字连接。 GCM确实有助于保持数据更新。它会唤醒手机,有时在由于网络问题而无法建立套接字连接时提供数据。