我在Android中测试了一个在React Native中开发的聊天应用程序,我注意到一个奇怪的行为,只取决于你如何将应用程序发送到后台。
需要两个设备来复制错误:Device1登录User1,Device2登录User2。
案例情况:
一旦Device1中的App处于后台状态,等待1-2分钟,直到de WebSocket连接关闭。然后,从User2向User1发送聊天消息。在Device1中再次打开应用程序(将其状态更改为“活动”)
在案例1中,您将正确收到消息,您将在聊天视图以及对话内看到消息。 在情况2中,消息的接收不一致。您可能会收到它,但它不会显示在聊天视图中,并且在对话内部将显示错误的顺序和/或时间戳。
答案 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);
}