如何保存数据并重新打开上次使用的Activity

时间:2016-07-11 12:54:06

标签: android

我已经完成了游戏机制的大部分工作,现在我需要能够:

  1. 保存当前活动的所有数据,并在返回时检索(我很感激{ {1}}如果这就是我的需要)

  2. 在相同的时间中从打开相同的SharedPreferences >我离开的时候就是这样。

  3. 更清楚一点:我希望每次应用程序关闭甚至杀死时都不要从主活动重新启动。

    修改

    好吧,我已经使用了这个Google article来保存我的活动并稍后重新创建它。

    我的一项活动中的代码如下:

    的onCreate()

    Activity

    的onSaveInstanceState()

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_player_selection);
    
        // Check whether we're recreating a previously destroyed instance
        if (savedInstanceState != null) {
            // Restore value of members from saved state
            village = savedInstanceState.getString(VILLAGE);
            seekBarProgress = savedInstanceState.getInt(PROGRESS);
        } else {
            // Probably initialize members with default values for a new instance
            initializeVariables();
            Bundle bundle = getIntent().getExtras();
            village = bundle.getString(VILLAGE);
        }
            [...] // Other code skipped
        }
    

    因此,我创建了一个Dispatcher Activity(现在是我的主要版本),当应用程序被杀死然后重新启动时,知道哪个是最后打开的要启动的活动。但是当我尝试这样做时,它应该打开(即)@Override public void onSaveInstanceState(Bundle savedInstanceState) { // Save the user's current game state savedInstanceState.putString(VILLAGE, village); savedInstanceState.putInt(PROGRESS, seekBarProgress); // Always call the superclass so it can save the view hierarchy state super.onSaveInstanceState(savedInstanceState); } 活动,我得到一个

      

    显示java.lang.NullPointerException

    因为它运行这部分代码

    PlayerSelection

    而不是之前的else { // Probably initialize members with default values for a new instance initializeVariables(); Bundle bundle = getIntent().getExtras(); village = bundle.getString(VILLAGE); }语句,它运行if

    分派器

    这是Dispatcher Activity,用于过滤应启动的Activity:

    else

    这是我发送给Dispatcher Activity的内容:

    public class Dispatcher extends Activity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        Class<?> activityClass;
    
        try {
            SharedPreferences prefs = getSharedPreferences("X", MODE_PRIVATE);
            activityClass = Class.forName(
                    prefs.getString("lastActivity", MainActivity.class.getName()));
        } catch(ClassNotFoundException ex) {
            activityClass = MainActivity.class;
        }
    
        startActivity(new Intent(this, activityClass));
        }
    }
    

    问题

    为什么会这样?我该怎么做才能解决这个问题?

3 个答案:

答案 0 :(得分:0)

对于1 ::您必须在离开活动之前将数据保存在数据库或共享首选项或类似内容中 例如,您可以在onDestroy()方法中保存数据,当您返回此活动时,从数据库中获取数据或...

对于2 :: inBackPressed()方法,使用Intent进行活动

答案 1 :(得分:0)

按后退键完成后,将不会调用onSaveInstanceState。要保存您的数据,您必须使用onPause代码显示:

@Override
public void onPause() {
    super.onPause();
    SharedPreferences sp = getSharedPreferences("X", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();
    editor.putString("lastActivity", HomeActivity.class.getCanonicalName());
}

请务必使用您自己的班级名称替换HomeActivity。但是,我没有测试函数getCanonicalName,但它应该有效。

Dispatch Activity中,您会重新读取该值并对其执行某些操作。

答案 2 :(得分:0)

  

为什么会这样?

Bundle中创建的onSaveInstanceState仅用于短期重启,例如由于方向更改而重新创建活动时如果您的活动正常停止,则不会保留Bundle,因此无法将其发送至onCreate

  

我该怎么做才能解决这个问题?

不使用instanceState模型,而是将活动状态保存在SharedPreferences中(类似于您已保存的lastActivity)。 您应该将自己的状态保存在onStoponPause中,并分别在onStartonResume中恢复。在大多数情况下,前者足够,后者只产生不必要的开销。

@Override
protected void onStart() {
    super.onStart();
    String saved = sharedPreferences.getString("myKey", null);
    MyPojo pojo;
    if(saved == null){
        pojo = defaultValue;
    }else {
        pojo = new Gson().fromJson(saved, MyPojo.class);
    }
}

@Override
protected void onStop() {
    sharedPreferences.edit().putString("myKey", new Gson().toJson(pojo)).apply();
    super.onStop();
}