Android - 部分关闭应用时丢失变量数据

时间:2015-08-21 22:22:02

标签: java android application-lifecycle

我在我的应用程序中使用了一个名为DB(用于数据库)的静态值类。当我第一次运行应用程序时,将填充并使用此类中的静态字节数组。然后,当我部分关闭我的应用程序时(如果在20秒后或多或少地重新打开它,那么我的应用程序的值仍然在这里),但是如果我让我的应用程序在后台运行超过1分钟值变为空。

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

正确处理生活方式事件是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
    }
...
}

我希望这有帮助!

祝你未来发展顺利!

答案 2 :(得分:0)

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

对于那些遇到同样问题的人:

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

@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();
}