使用主页或后退物理按钮将应用程序发送到后台状态时的不同行为

时间:2017-05-12 08:11:36

标签: android react-native back-button android-homebutton

我在Android中测试了一个在React Native中开发的聊天应用程序,我注意到一个奇怪的行为,只取决于你如何将应用程序发送到后台。

需要两个设备来复制错误:Device1登录User1,Device2登录User2。

案例情况:

  1. 使用主页按钮将应用程序从活动状态发送到背景状态。
  2. 使用后退物理按钮将应用程序从活动状态发送到后台状态。
  3. 一旦Device1中的App处于后台状态,等待1-2分钟,直到de WebSocket连接关闭。然后,从User2向User1发送聊天消息。在Device1中再次打开应用程序(将其状态更改为“活动”)

    在案例1中,您将正确收到消息,您将在聊天视图以及对话内看到消息。 在情况2中,消息的接收不一致。您可能会收到它,但它不会显示在聊天视图中,并且在对话内部将显示错误的顺序和/或时间戳。

3 个答案:

答案 0 :(得分:1)

这是由应用程序(活动)生命周期引起的:

a)按home键时,onStop()方法被调用但没有onDestroy(),因此你的应用程序仍处于活动状态,直到操作系统需要资源并且它会破坏它,这就是为什么在这种情况下为你工作的原因。

b)当你按下后退按钮时,onStop()方法是调用而且是onDestroy(),因此你的应用程序被立即销毁,这就是为什么在这种情况下你不能使用它。

答案 1 :(得分:0)

回答你的问题听起来非常简单,但实际上要解决问题需要额外处理。

1)当用户按下主页按钮应用程序进入后台时,活动处于活动状态,操作系统将在需要资源时终止。

2)当用户按下硬件后退按钮OS会终止活动并释放资源。

您可以使用以下方法解决问题。

您需要在服务中侦听消息并将其存储在本地存储中,并仅在可用时更新UI。

答案 2 :(得分:0)

正如其他人提到的那样,后退按钮最终会终止该活动以释放资源。虽然无法保证Android OS不会终止您的活动,但是您可以通过将以下代码添加到MainActivity类中来更改后退按钮的默认行为,以不终止活动:

@Override
public void invokeDefaultOnBackPressed() {
    // do not call super. invokeDefaultOnBackPressed() as it will close the app.
    // Instead lets just put it in the background.
    moveTaskToBack(true);
}