Android - 在全球范围内跟踪看不见的通知、最佳做法
Android - Keep global track of unseen notifications, best practices
在Android中,我有一个套接字与服务器保持实时通信。
此应用程序套接字由服务控制,该服务在启动时和/或应用程序发出请求时启动。
因为我不能依赖 Google PlayStore,所以我完全控制手动发送和接收推送消息。
每当新的推送消息从服务器到达时,套接字服务会发送本地广播消息,监听活动可以按照自己的操作进行。如果没有找到活动,默认的 android 通知给用户,说'[ap] 你有 {n} 条新消息'...
这有其稳定性问题(例如,当内存不足时,可以通过 OS 关闭服务)但没关系。
现在,考虑以下内容:
我有多个活动可以侦听并显示未读消息的计数。
- 首页
- ConversationsOverviewPage
- 'The' 对话页(chatpage)
每个activity可以在前台,但也可以在内存中以供用户后退时返回1 activity。所以在理论上,可能会出现您想立即更新 different/multiple 活动的情况。这可以避免在用户返回到 [=75= 时必须 're-load' 来自服务器的未读消息].所以我认为广播模式效果最好。
保持全局跟踪未读邮件的最佳做法是什么,同时最大限度地减少每个 activity 实例的服务器访问:
- 非常简单:对每个 activity 实例发出服务器请求,并为每个 activity 再次编写更新代码。 但是这会导致用户看到延迟,因为应用需要一秒钟的时间才能从服务器接收数据并显示 'unread-messages' 气球。
Simpel: 有一个全局 class.. 保存每个会话的未读消息,但是 我觉得这可能会导致数据不完整的问题。尤其是当应用程序不是 'active'
时
我的旧投票:有另一个服务跟踪未读消息,它在启动时启动(就像套接字一样)..只有当服务启动/启动时,它将从服务器请求所有未读消息数据。每个 activity 可以比 'ask' 的未读消息数据,不用再担心了。
但是这可能有点矫枉过正?
我的新投票:保留套接字服务,并向该服务添加一个单独的class..保存未读数据.. 但是 这也感觉不对.. 因为 activity 将不得不向服务询问一些超出范围的事情.. 它不是套接字关注的管理未读消息(关注点分离),对吗?
非常感谢有经验的开发人员的任何感谢!
第三个选项可以。不确定 overkill
到底在哪里。显然,您不应该在每次启动或套接字重新连接时下载所有未读消息。最重要的经验法则是在应用真正需要时加载数据。关于我如何开发同一个应用程序的一些时刻:
- 有套接字
Service
处理连接、断开、发送数据(消息)和接收数据。
- 有
Notification manager
从 SocketService
接收事件。它保存来自服务器的新数据并决定应该发送哪个广播通知。
- 当套接字连接时,它从服务器接收状态数据:
- 每次聊天的最后更新日期(时间戳)。例如,如果本地数据库包含昨天更新的聊天
A
但从服务器新收到的数据表明聊天 A
几秒钟前更新,您需要广播 chat A has been updated since last connection
之类的事件并保存更新日期。如果有任何 activity 以某种方式显示聊天 A
它加载(通过 http 或其他)新数据。
last messages
每次聊天。该应用程序只是比较本地保存的 last messages
和新收到的。如果有新的应用程序再次广播 there is unread message/messages from user x
之类的事件。如果可见 activity 显示更新的聊天,它会更新数据,否则应用程序会显示通知。
所以接下来处理未读消息的基本流程是:连接到服务器>
检查是否有未读消息的数据>
将新数据保存到本地数据库>
广播有关新数据的事件。
我建议您同时使用 GCM
和套接字连接。 GCM
确实有助于保持数据更新。它会唤醒 phone,有时会在由于网络问题无法建立套接字连接时传送数据。
在Android中,我有一个套接字与服务器保持实时通信。 此应用程序套接字由服务控制,该服务在启动时和/或应用程序发出请求时启动。
因为我不能依赖 Google PlayStore,所以我完全控制手动发送和接收推送消息。
每当新的推送消息从服务器到达时,套接字服务会发送本地广播消息,监听活动可以按照自己的操作进行。如果没有找到活动,默认的 android 通知给用户,说'[ap] 你有 {n} 条新消息'...
这有其稳定性问题(例如,当内存不足时,可以通过 OS 关闭服务)但没关系。
现在,考虑以下内容:
我有多个活动可以侦听并显示未读消息的计数。
- 首页
- ConversationsOverviewPage
- 'The' 对话页(chatpage)
每个activity可以在前台,但也可以在内存中以供用户后退时返回1 activity。所以在理论上,可能会出现您想立即更新 different/multiple 活动的情况。这可以避免在用户返回到 [=75= 时必须 're-load' 来自服务器的未读消息].所以我认为广播模式效果最好。
保持全局跟踪未读邮件的最佳做法是什么,同时最大限度地减少每个 activity 实例的服务器访问:
- 非常简单:对每个 activity 实例发出服务器请求,并为每个 activity 再次编写更新代码。 但是这会导致用户看到延迟,因为应用需要一秒钟的时间才能从服务器接收数据并显示 'unread-messages' 气球。
Simpel: 有一个全局 class.. 保存每个会话的未读消息,但是 我觉得这可能会导致数据不完整的问题。尤其是当应用程序不是 'active'
时
我的旧投票:有另一个服务跟踪未读消息,它在启动时启动(就像套接字一样)..只有当服务启动/启动时,它将从服务器请求所有未读消息数据。每个 activity 可以比 'ask' 的未读消息数据,不用再担心了。 但是这可能有点矫枉过正?
我的新投票:保留套接字服务,并向该服务添加一个单独的class..保存未读数据.. 但是 这也感觉不对.. 因为 activity 将不得不向服务询问一些超出范围的事情.. 它不是套接字关注的管理未读消息(关注点分离),对吗?
非常感谢有经验的开发人员的任何感谢!
第三个选项可以。不确定 overkill
到底在哪里。显然,您不应该在每次启动或套接字重新连接时下载所有未读消息。最重要的经验法则是在应用真正需要时加载数据。关于我如何开发同一个应用程序的一些时刻:
- 有套接字
Service
处理连接、断开、发送数据(消息)和接收数据。 - 有
Notification manager
从SocketService
接收事件。它保存来自服务器的新数据并决定应该发送哪个广播通知。 - 当套接字连接时,它从服务器接收状态数据:
- 每次聊天的最后更新日期(时间戳)。例如,如果本地数据库包含昨天更新的聊天
A
但从服务器新收到的数据表明聊天A
几秒钟前更新,您需要广播chat A has been updated since last connection
之类的事件并保存更新日期。如果有任何 activity 以某种方式显示聊天A
它加载(通过 http 或其他)新数据。 last messages
每次聊天。该应用程序只是比较本地保存的last messages
和新收到的。如果有新的应用程序再次广播there is unread message/messages from user x
之类的事件。如果可见 activity 显示更新的聊天,它会更新数据,否则应用程序会显示通知。
- 每次聊天的最后更新日期(时间戳)。例如,如果本地数据库包含昨天更新的聊天
所以接下来处理未读消息的基本流程是:连接到服务器>
检查是否有未读消息的数据>
将新数据保存到本地数据库>
广播有关新数据的事件。
我建议您同时使用 GCM
和套接字连接。 GCM
确实有助于保持数据更新。它会唤醒 phone,有时会在由于网络问题无法建立套接字连接时传送数据。