在Android中,我有一个套接字保持与服务器的实时通信。 此应用程序套接字由服务控制,该服务在启动时和/或应用程序发出请求时启动。
因为我不能依赖Google PlayStore,所以我完全控制手动发送+接收推送消息。
每当从服务器到达新的推送消息时,套接字服务发送本地广播消息,并且监听活动可以遵循自己的动作。如果没有找到活动,则向用户提供默认的android通知,说'[ap]你有{n}个新消息......
这有其稳定性问题(例如,当内存不足时,操作系统可以关闭服务)但是没关系。
现在,请考虑以下事项:
我有多个侦听的活动,并显示未读消息的数量。
每个活动都可以在前台,但也可以在内存中用于当用户反压并返回1个活动时。因此,在理论上,您可能希望一次更新不同/多个活动。这可以防止在用户返回“savedInstance”时不得不从服务器“重新加载”未读消息。所以我认为广播模式效果最佳。
保持全局跟踪未读消息的最佳做法是什么,同时最大限度地减少每个活动实例上的服务器行程:
Simpel :拥有一个全局类..保留每个会话的未读消息,但是我觉得这会导致数据不完整的问题。特别是当应用程序没有“活跃”时
我的旧投票:有另一项服务跟踪未读消息,这些消息在启动时启动(就像套接字一样)..只有当服务启动/启动时,它才会请求来自服务器的所有未读消息数据。每个活动都可以“询问”未读消息数据,而不必再担心它。 但这可能有点矫枉过正?
我的新投票:保留套接字服务,并为此服务添加一个单独的类。这包含未读数据.. 但是这个也觉得不对。因为活动必须要求服务超出范围..它不是管理未读消息(关注点分离)的套接字,对吗?
非常感谢有经验的开发人员!
答案 0 :(得分:1)
第三个选项没问题。不确定overkill
到底在哪里。显然,你不应该在每次启动或套接字重新连接时下载所有未读消息。最重要的经验法则是在应用程序真正需要时加载数据。关于我对同一个应用程序的开发方式很少:
Service
,用于处理连接,断开连接,发送数据(消息)和接收数据。Notification manager
来自SocketService
的活动。它保存来自服务器的新数据并决定应该发送哪个广播通知。A
但是新收到的服务器数据表明聊天A
在几秒钟前更新了,则需要广播chat A has been updated since last connection
之类的事件并保存更新日期。如果有任何活动以某种方式显示聊天A
,则会加载(通过http或其他任何)新数据。last messages
。该应用只比较本地保存的last messages
和新收到的。如果有新的应用程序再次播放像there is unread message/messages from user x
这样的事件。如果有可见活动显示更新的聊天,则会更新数据,否则应用会显示通知。因此,接下来处理未读消息的基本流程是:连接到服务器>
检查是否有关于未读消息的数据>
将新数据保存到本地数据库>
广播事件关于新数据。
我建议您同时使用GCM
和套接字连接。 GCM
确实有助于保持数据更新。它会唤醒手机,有时在由于网络问题而无法建立套接字连接时提供数据。