在Android中,我有一个与服务器保持实时通信的套接字。此应用程序套接字由一个服务控制,该服务在启动时和/或应用程序发出请求时启动。
因为我不能依赖Google PlayStore,所以我完全可以手动控制推送消息的发送和接收。
每当服务器发出新的推送消息时,套接字服务就会发送一条本地广播消息,侦听活动就可以按照自己的操作进行。。如果没有找到任何活动,则会向用户发出默认的android通知,称为"[ap]You have{n}new message(s("。。。
这有其稳定性问题(例如,当内存不足时,操作系统可能会关闭服务(,但它还可以。
现在,考虑以下内容:
我有多个活动可以侦听和显示未读邮件的计数。
- 主页
- 对话概述页面
- "The"对话页面(聊天页面(
每个活动都可以在前台,但也可以在内存中,以便用户按下并返回1个活动。因此,在理论上,可能存在一种情况,即您希望同时更新不同/多个活动。。这样可以防止用户返回到"savedInstance"时不得不从服务器"重新加载"未读消息。所以我认为广播模式效果最好。
保持未读消息的全局跟踪,同时最大限度地减少每个活动实例的服务器行程的最佳做法是什么:
- 非常简单:对每个活动实例发出服务器请求,并为每个活动再次编写更新代码但是这会导致用户看到延迟,因为应用程序需要一秒钟的时间才能从服务器接收数据并显示"未读消息"气球
-
Simpel:拥有一个全球性的课堂。。保持每次对话的未读消息,但我觉得这可能会导致数据不完整的问题。。尤其是当应用程序不是"活动"时
-
我的旧投票:拥有另一个跟踪未读消息的服务,该服务在启动时启动(就像套接字一样(。。只有当服务启动/引导时,它才会从服务器请求所有未读消息数据。每个活动都可以"询问"未读消息数据,再也不用担心了。但是这可能有些过头了?
-
我的新投票:保留套接字服务,并向该服务添加一个单独的类。。保存未读数据但是这也感觉不对。。由于活动将不得不询问服务范围之外的内容。。管理未读消息(关注点分离(不是套接字关注点,对吧?
非常感谢经验丰富的开发人员!
第三个选项可以。不确定overkill
到底在哪里。显然,您不应该在每次启动或套接字重新连接时下载所有未读消息。最重要的经验法则是在应用程序真正需要数据时加载数据
- 有用于处理连接、断开、发送数据(消息(和接收数据的套接字
Service
- 存在从CCD_ 4接收事件的CCD_。它保存来自服务器的新数据,并决定应该发送哪个广播通知
- 当套接字连接时,它从服务器接收状态数据:
- 每次聊天的上次更新日期(时间戳(。例如,如果本地数据库包含聊天
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
确实有助于保持数据的更新。当由于网络问题无法建立套接字连接时,它会唤醒手机,有时还会发送数据。