【问题标题】:Android: keep activity working while in backstackAndroid:在后台堆栈中保持活动正常工作
【发布时间】:2016-09-28 20:59:25
【问题描述】:

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

活动 A(显示一些常规内容的主屏幕)

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

活动 C(用户通过单击菜单从 B 导航到此处。C 显示参与者列表,房间所有者可以将某人踢出去等)

所以,当我在 C 时,我以 A-> B -> C 的身份到达。

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

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

【问题讨论】:

  • 您需要一个后台Service 来保持与您的服务器的连接。任何其他解决方案都是不可靠的。如果您在使用 Service 时遇到问题,请发布相关问题。

标签: android android-activity java-websocket


【解决方案1】:

当您在 C 时,Activity B 将暂停

Google 提及

活动生命周期

系统中的活动作为活动堆栈进行管理。当一个新的 Activity 启动后,它被放在栈顶,变成 正在运行的活动 - 上一个活动始终保持在其下方 在堆栈中,直到新的 活动退出。

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

【讨论】:

  • 我没有选择 IntentService 的原因是 - 根据文档,它一旦用完就会停止。在我的套接字上,我可以发送音频、文本并且可以随时接收消息。所以,我希望它继续监听,而不是让套接字在完成广播文本或音频字节时自行停止。我对这个问题的理解是错误的吗?或者我应该让计时器之类的东西保持活动状态,以免 IntentService 自行停止?
  • IntentService 是解决此问题的错误方法,正如@techtinkerer 所述。他应该使用Service,而不是IntentService
【解决方案2】:

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

要回答您的问题,您的 Activity B 在任务中是活跃的,并且 Activity 中的异步代码将继续运行。仅仅因为 Activity 被“暂停”并不意味着不能在其上调用方法。它仍然是一个活体。

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

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

【讨论】:

  • 谢谢大卫。我将继续使用服务。我是否需要将其置于前台以保持其可靠性并确保它在不丢失数据包的情况下侦听和流式传输音频?如您所知,如果有人说话,音频包会非常频繁地出现。对我来说幸运的是,音频只传出,只有文本传入。两种方式都没有音频。
  • 如果用户正在与之交互,您可以将其设为前台Service。这应该可以防止 Android 将其杀死。但是,如果用户没有积极使用它,则不应将其设为前台 Service,这是不好的行为。
【解决方案3】:

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

【讨论】:

  • IntentService 是解决此问题的错误方法。 IntentService 用于短期后台处理,而不是用于与服务器的长期套接字连接。他应该使用Service,而不是IntentService
【解决方案4】:

有两种方法可以实现:

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

  2. 在移动到另一个活动时保持套接字连接。在活动 C 打开时重新连接到套接字连接。

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

【讨论】:

  • 在活动转换期间关闭和重新打开套接字是草率的,并且您有根本没有连接的窗口。这绝对是错误的做法。 OP 需要一个Service 并持续连接到他的服务器。
猜你喜欢
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多