在应用程序之间切换时 Android Activity 会丢失数据

问题描述 投票:0回答:2

我正在编写我的第一个 Android 应用程序。本质上,它显示并控制直接台球比赛的得分。我读过有关活动生命周期的文章,但仍然有一个我不明白的问题:

当我切换回正在运行的游戏的应用程序时(因此显示的分数与最初的 0:0 不同),活动有时会丢失其状态并显示 0:0 而不是我离开应用程序时的分数。我重载了方法

onSaveInstanceState
onRestoreInstanceState
。当我按下设备的主页按钮时,会调用前者。后者永远不会被调用。我读过该方法仅在调用
onCreate
时才会被调用。尽管在切换到其他应用程序后应用程序需要比平时更长的时间来重新加载,但
onCreate
方法不会被调用。所以我认为该活动确实得到了重建,但显然不是由
onCreate
重建的,并且保存的分数也不是由
onRestoreInstanceState
加载的。

您能解释一下发生了什么以及如何实现所需的行为吗?非常感谢!

编辑:我被要求发布我的

onCreate()
onSaveInstanceState()
方法。我尝试以一种有用的方式缩短它们。如果有什么不清楚或遗漏的地方请告诉我。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final GameSetting gameSetting = getGameSettings();
        final GameData gameData = new GameData(gameSetting.getLeague());
        game = new GameLogic(gameData);

        scoreViews.put(PlayerId.PLAYER_A, (TextView) findViewById(R.id.playerAScore));
        
    }
    @Override
    protected void onSaveInstanceState(@NonNull final Bundle outState) {
        GameDataInstanceSupplier.saveInstance(game.getGameData(), outState);
        // inside the method the data gets saved like
        // outState.putInt(STATE_SCORE_A, data.getScore(PlayerId.PLAYER_A));

        super.onSaveInstanceState(outState);
    }
    @Override
    protected void onRestoreInstanceState(@NonNull final Bundle inState) {
        super.onRestoreInstanceState(inState);
        GameDataInstanceSupplier.restoreInstance(game.getGameData(), inState);
        // inside the method the data gets loaded like
        // data.setScore(PlayerId.PLAYER_A, inState.getInt(STATE_SCORE_A));
    }

我在

onCreate()
方法中放置了“调试输出”,但它没有出现在调试日志中。
onRestoreInstanceState()
也是如此。当我按下主页按钮时,
onSaveInstanceState()
里面打印了一条消息。

android android-lifecycle onrestoreinstancestate
2个回答
0
投票

我认为你的应用程序不是问题,你看,我来找到这个页面是因为我在我的 Android 手机中切换应用程序时遇到同样的问题,当使用 2 因素身份验证并且必须切换到短信、邮件或其他应用程序获取发送的代码,当切换回浏览器或应用程序(例如团队)上的代码输入屏幕时,它不再存在,并且返回到开头,例如登录屏幕。这非常烦人,因为我已经禁用了与节能有关的所有功能,但仍然存在问题。我发现,如果我先打开消息应用程序,然后在快速切换时进行身份验证,只需在 1 或 2 秒内查看代码,然后返回,有时它会起作用。这可能是内存问题,也可能是节能方面未实现的策略。我认为可能是最后一个,因为其他明确规定的属性(例如设置屏幕亮度自动调整关闭并设置为最大值)会工作一段时间,然后返回默认值。它甚至可能是有计划的报废。我的手机是华为 P smart 2019 (POT-LX3),运行 Android 10。我可能会尝试恢复出厂设置。欢迎任何建议。


0
投票

我在 Android 14 的小米手机上也遇到了同样的问题,并找到了以下解决方案。请考虑到这些说明是我自己翻译预期文本而编写的(因为我测试的手机不是英语),如果不完全适合,请根据您的情况进行调整。总体思路是操作系统为每个应用程序都有一层节能配置,这似乎独立于全局手机的配置。

  1. 转到您想要“保持唤醒”的应用程序的信息屏幕,我们将其称为“X”。这可以通过多种方式完成:

    • Settings
      >
      Battery
      >
      Apps
      > 选择应用程序“X” > 单击
      Details
      按钮
    • Settings
      >
      Applications
      >
      Manage applications
      > 选择应用程序“X”
  2. 单击

    Battery saving
    链接。这将打开一个屏幕,您可以在其中从限制较少到限制较多的多种模式中进行选择。在这里,我发现尽管没有激活全局“省电”模式,但我的所有应用程序都选择了
    Battery saving (recommended)
    模式。然后选择较轻的模式(在我的例子中,
    No restrictions
    )。

  3. 检查您现在是否可以在“X”应用程序之间切换,并且它保持其状态而不会重新加载或丢失数据。

© www.soinside.com 2019 - 2024. All rights reserved.