Android:在 backstack 中保持 activity 工作

Android: keep activity working while in backstack

我有一个这样的聊天应用程序:

Activity A(主屏幕显示一些一般的东西)

Activity B ( 聊天室,用户可以在其中使用 WebSocket 发送和接收消息。我将 websocket 设为全局,instantiated/reconnected 在 B 中设为单例,因为放入服务似乎是个问题- 不可靠,有时会在它持有的套接字变为空等并需要重新初始化等情况下重新启动等)

Activity C(用户通过点击菜单从 B 导航到这里。C 显示参与者列表,房间的所有者可以将某人踢出等)

所以,当我在 C 时,我已经到达了 A-> B -> C。

当我在 C 时,我仍然希望 B 继续接收消息,处理它们,将它们放入 messagesadapter 等。这是因为,我们不想在屏幕中丢失聊天消息(在 B 中处理) C.

问题 - 当我在 C 中时,B 功能会继续工作吗?我想确保它有效。我需要什么来确保它可靠地发生?

Activity 当你在 C 时 B 会暂停

Google 提及

Activity Lifecycle

Activities in the system are managed as an activity stack. When a new activity is started, it is placed on the top of the stack and becomes the running activity -- the previous activity always remains below it in the stack, and will not come to the foreground again until the new activity exits.

要实现您想要的效果,您需要一个 IntentService 将 运行 在后台运行,并且您必须注册一个 广播接收器[= activity B 中的 19=] 从 IntentService 获取消息,然后在 activity B 的 onResume 方法中,您可以使用来自广播接收器的最新消息更新 UI。

最好的解决方案是创建一个 IntentService,它将使您的套接字连接保持活动状态并继续获取设备中的消息,当您返回 activity B 时,您可以在 onResume 中获取所有最新消息形成本地存储并更新列表适配器。

有两种方法可以实现:

  1. 当用户从activity B 移动到activity C 时,关闭套接字连接并在首选项中保存最后一条消息的"timestamp"。现在,当用户在 activity C 中时,您的服务器可以通过 FCM(或 GCM)推送更新让我们说 "SYNC",这会告诉您的应用服务器上有新的更新。从服务器收到此通知后,调用服务器将首选项中存储的 "timestamp" 传递给服务器。现在,服务器的工作是 return 在传递的 "timestamp" 之后的消息列表。将所有消息存储在本地数据库中。一旦用户返回 activity B,从本地数据库加载新消息。

  2. 移动到另一个时保持套接字连接activity。打开 activity C.

  3. 时重新连接到套接字连接

您可以查看我们开源的androidchat sdk代码以供参考:https://github.com/AppLozic/Applozic-Android-SDK

Question - when I am in C, will B functionality keep working ? I want to make sure it works. What do I need to ensure it happens reliably ?

为了回答您的问题,您的 Activity B 在任务和异步代码中处于活动状态 Activity 将继续 运行。仅仅因为 Activity 是 "paused" 并不意味着不能对其调用方法。它仍然是一个活动对象。

如果您只想在用户在前台使用您的应用程序时激活您的聊天,那么您可以按照您描述的方式进行。一旦您的应用程序进入后台(例如,在来电到达时),Android 可以在没有警告的情况下终止进程。当用户 returns 访问您的应用程序时,Android 将为它创建一个新进程并且 Activity C 将被重新实例化。但是,Activity B 不会被重新实例化。

但是,您确实需要 Service 来处理套接字连接,因为它更稳定。