我的聊天应用程序是这样的:
活动A(显示一些常规内容的主屏幕)
活动B(用户可以使用WebSocket发送和接收消息的聊天室。我将websocket全局化,在B中实例化/重新连接,以及单例,因为投入服务似乎是一个问题 - 不可靠,有时会重新启动它持有的socket变为null等,需要重新初始化等。)
活动C(用户通过点击菜单从B导航到此处.C显示参与者列表,房间的所有者可以踢出某人等。)
所以,当我在C时,我已经到了A-> B - >下进行。
当我在C时,我仍然希望B继续接收消息,处理它们,将它们放入messageadapter等等。这是因为,我们不想在屏幕C中丢失聊天消息(在B中处理)。
问题 - 当我在C时,B功能会继续工作吗?我想确保它有效。我需要什么来确保它可靠地发生?
答案 0 :(得分:3)
当您在C
时,活动B将暂停Google提及
活动生命周期
系统中的活动作为活动堆栈进行管理。当一个新的 活动开始后,它被放置在堆栈的顶部并成为 正在运行的活动 - 之前的活动始终低于它 在堆栈中,并且在新的之前不会再次出现 活动退出。
要实现您的目标,您需要一个将在后台运行的 IntentService ,并且您必须在活动B中注册广播接收器以获取来自IntentService,然后在活动B的onResume方法中,您可以使用来自广播接收器的最新消息更新UI。
答案 1 :(得分:1)
最好的解决方案是创建一个IntentService,它将使您的套接字连接保持活动并继续在设备中获取消息,当您返回活动B时,在onResume中,您可以从本地存储中获取所有最新消息并更新列表适配器。
答案 2 :(得分:1)
问题 - 当我在C时,B功能会继续工作吗?我想要 确保它有效。我需要什么来确保它可靠地发生?
要回答您的问题,您的Activity
B在任务中处于活动状态,Activity
中的异步代码将继续运行。仅仅因为Activity
被“暂停”并不意味着无法在其上调用方法。它仍然是一个活的对象。
如果您只希望在用户将应用程序置于前台时激活聊天,则可以按照您所描述的方式进行。一旦您的应用程序进入后台(例如,在传入呼叫到达时),Android就可以在没有警告的情况下终止该进程。当用户返回您的应用时,Android将为其创建一个新流程,并且将重新激活活动C
。但是,Activity
B将不会重新实例化。
但是,您确实需要一个Service
来处理套接字连接,因为它更稳定。
答案 3 :(得分:0)
有两种方法可以实现这一目标:
当用户从活动B移动到活动C时,关闭套接字连接并保存"时间戳"首选项中的最后一条消息现在,当用户处于活动C时,您的服务器可以推送更新,让我们说" SYNC"通过FCM(或GCM)告诉您的应用程序服务器上有新的更新。从服务器收到此通知后,调用服务器传递"时间戳"从首选项存储到服务器。现在,服务器的工作是在传递的"时间戳"之后返回消息列表。将所有消息存储在本地数据库中。用户返回活动B后,从本地数据库加载新消息。
移动到另一个活动时保持套接字连接。在打开活动C时重新连接到套接字连接。
您可以查看我们的开源android聊天sdk代码以供参考:https://github.com/AppLozic/Applozic-Android-SDK