简单套接字客户端应用程序的模式或最佳实践

时间:2014-10-16 18:44:02

标签: android sockets client chat

(这个问题也被问到in Portuguese。)

首先,为长篇文章道歉并在一个问题中提出这么多要点。我认为这样做是最好的,因为它们是相互关联的,也因为我认为任何有这种应用经验的人(Android套接字客户端与服务器保持持久连接以发送/接收消息)都能够回答所有或许多要点。基本上我会就一些设计决策提出建议,而我不确定推荐的Android操作方式是什么。是

我试图确定在Android中实现此类应用程序(套接字客户端)的最佳方法是什么。它将使用诸如WebSocket,Socket.IO,TCP等的套接字通信技术来保持与远程服务器的持久连接以交换信息。除了它可能不是聊天应用程序之外,我没有特定的案例用法,因为它的优先技术是推送通知(GCM或类似的东西)。我正在考虑一个应用程序,只要用户已登录,该应用程序就会保持连接处于打开状态。'它

连接不应与应用程序的活动联系在一起,即在用户离开应用程序后最终仍然可以收到消息(最终创建通知)。

我试图回答的问题是为了定义这样的应用程序:

  1. 是否应将连接处理(连接/断开连接)和消息发送委托给单独的类(例如Singleton)?

  2. 选择广播将收到的消息传递给当前Activity似乎没问题;有更合适的解决方案吗?即使应用程序架构相当简单,事件总线或绑定到Service会更好吗?

  3. 考虑到连接必须在进程终止时保持连接(因为系统通常会释放内存),最好的方法是委托连接'对Service进行操作,并使用重写的startCommand()方法返回START_STICKY(只要系统的内存可用,就允许Service重新启动)?这是最合适的方法吗?我想是的,因为在AlarmManager中设置定期连接检查在这种情况下听起来是不必要的,并且使用startForeground()并不会阻止应用程序被杀死(它只会降低发生的可能性)和还会向用户显示应用程序正在运行的不良通知。

  4. 当我们就设计达成一致时,我认为需要添加唤醒锁,以防止设备在处理传入/传出数据时保持睡眠状态。我不确定如何将它们添加到最终设计中,但我要求澄清。我想到了以下额外的考虑因素:

    a)传入的数据预计会唤醒设备但不能保证在它恢复睡眠之前完全处理;

    b)设备在与服务器的连接可用时处于睡眠状态(由CONNECTIVITY_CHANGE广播发出信号)这一事实不应该阻止在应用程序中排队的许多外发消息被发送,但是我不愿意# 39;知道如何在此设计中添加唤醒锁,以保证队列得到完全处理;

    c)我的协议库可能已经准备好与Android一起工作(即处理一个或多个非UI线程中的I / O),但其回调可能无法保证在非UI线程中运行(库可能将它们委托给UI线程)。这可能会影响我通过代码处理唤醒锁的方式。

  5. 我是否需要保持主动运行的线程循环以保持连接打开?我怎么能绕过那个?

  6. 对这些问题的任何反馈表示赞赏。

0 个答案:

没有答案