【问题标题】:Android - losing variables data when partially closing an appAndroid - 部分关闭应用程序时丢失变量数据
【发布时间】:2023-03-08 06:07:01
【问题描述】:

我在我的应用程序中使用了一个名为 DB(用于数据库)的静态值类。当我第一次运行应用程序时,这个类的一个静态字节数组被填充和使用。然后,当我部分关闭我的应用程序(不关闭它肯定只是放在后台)如果在大约 20 秒后重新打开它,变量的值仍然在这里但是如果我让我的应用程序在后台超过 1分钟值变为空。

我怎样才能避免这种情况发生?

【问题讨论】:

  • 将您的数据存储在数据库或共享首选项中,就像您应该做的那样
  • 是的,但我不想在我真正关闭我的应用程序时保存它
  • 无法知道您是否正在关闭应用程序或操作系统正在杀死您的应用程序
  • 我的意思是,我希望在暂停和恢复我的应用程序之间但在启动和终止我的应用程序之间保存字节数组
  • 就像我刚才说的there is no way to know if you are closing the app or the OS is killing your app。当您的应用程序进入后台或切换活动时会调用 onPause,因此请保存在那里,但如果您的应用程序被操作系统杀死,您将无法删除它

标签: java android application-lifecycle


【解决方案1】:

将您的变量值存储到shared preferences 并从onResume() 活动方法中的共享首选项中加载值,并将值存储在 onPause() 方法中。

【讨论】:

    【解决方案2】:

    正确处理生活方式事件是 Android 开发的一个重要方面。

    我建议您阅读以下内容,以确保您了解当您关闭屏幕、切换到另一个应用程序或任何其他可能改变您的应用程序状态的操作时,您的应用程序会发生什么:

    http://developer.android.com/training/basics/activity-lifecycle/index.html

    我的建议是通过覆盖 onSaveInstanceState() 来存储您的数据,如下所示:

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) 
    {
        // Save the user's current game state
        savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
        savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
    
        // Always call the superclass so it can save the view hierarchy state
        super.onSaveInstanceState(savedInstanceState);
    }
    

    然后在你的 onCreate() 上,你可以像这样重新加载它:

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState); // Always call the superclass first
    
        // Check whether we're recreating a previously destroyed instance
        if (savedInstanceState != null) 
        {
            // Restore value of members from saved state
            mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
            mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
        } 
        else 
        {
            // Probably initialize members with default values for a new instance
        }
    ...
    }
    

    我希望这会有所帮助!

    祝你未来发展好运!

    【讨论】:

    • 这很好,但你的回答并不完全适合我的问题。运行应用程序时我的 byte[] 必须为 null 并且在所有活动中必须相同,我该如何使用您的方法处理这种情况?因为您说我必须在 onCreate 方法中设置字节数组的值,但在我的 onCreate 方法中,我的字节数组为空,它的值稍后设置。一旦设置,它就会与其他活动共享,当应用程序被杀死时,字节[]必须保存为空。
    【解决方案3】:

    我在评论者的帮助下找到了解决方案。

    对于那些有同样问题的人:

    在您的所有活动中复制此内容,以确保数据在首选项中不断更新:

    @Override
    public void onPause(){
        super.onPause();
        String bytearray = Base64.encodeToString(DB.bytearray, Base64.DEFAULT);
        prefs.edit().putString("BYTEARRAY", bytearray).apply();
    }
    @Override
    public void onResume(){
        super.onResume();
        String bytearray = prefs.getString("BYTEARRAY", Base64.encodeToString(DB.bytearray, Base64.DEFAULT));
        DB.bytearray = Base64.decode(bytearray, Base64.DEFAULT);
    }
    

    然后,将此代码添加到您的所有活动中,以确保在您关闭应用时不会保存值。

    @Override
    public void onDestroy(){
        super.onDestroy();
        String bytearray = "";
        prefs.edit().putString("BYTEARRAY", bytearray).apply();
    }
    

    【讨论】:

    • 在这种情况下,您应该使用捆绑包 onsavedinstance 而不是共享首选项。虽然您的解决方案是有效的。
    • 怎么样?发布您的解决方案,它可能会比我的更好!
    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2011-06-12
    • 1970-01-01
    • 2016-04-06
    相关资源
    最近更新 更多