覆盖onSavedInstanceState:savedInstanceState对象始终为null

时间:2017-03-29 07:26:54

标签: android android-intent

我有两项活动(A和B)。活动A调用活动B.活动B有这样的后退(向上)按钮:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

现在按下此UP按钮时,再次调用onCreate of activity A。在活动A中,有一个classId变量(我从Intent获得)我想要保留。为此,我在活动A onCreate中有以下代码:

        if (savedInstanceState == null)
        {
            Intent intent = getIntent();
            classId = intent.getIntExtra("CLASS_ID", 0);
        }
        else
        {
            classId = savedInstanceState.getInt("CLASS_ID");
        }

我还覆盖了onSavedInstanceState方法:

@Override
protected void onSaveInstanceState(Bundle savedInstanceState)
{
    savedInstanceState.putInt("CLASS_ID", classId);
    super.onSaveInstanceState(savedInstanceState);
}

我正在关注这个答案: onCreate being called on Activity A in up navigation

我面临的问题是,当我通过传回活动B中的按钮再次来到活动A时,onCreate被调用,我发现savedInstanceState为NULL。

修改

还有其他方法可以保存我的classId变量,这样当我再次返回活动A时,我可以使用它吗?

修改2

如果我将活动A的启动模式设置为清单文件中的SingleTop,我的问题就会得到解决。这是正确的做法吗?

3 个答案:

答案 0 :(得分:1)

您不应该假设每次进入下一个活动时都会onSaveInstanceState调用。请参阅文档

在活动被杀之前调用此方法,以便在将来某个时间返回时可以恢复其状态。例如,如果活动B在活动A前面启动,并且在某些时候活动A被杀死以回收资源,活动A将有机会通过此方法保存其用户界面的当前状态,以便在用户返回时对于活动A,可以通过onCreate(Bundle)或onRestoreInstanceState(Bundle)恢复用户界面的状态。

您可以进一步咨询官方文档here

答案 1 :(得分:0)

试试这个

public class SingletonHolder {

    //your id here as what data type you want


    private  static SingletonHolder instance;

    public static SingletonHolder getInstance() {
        if (instance == null) {
            instance = new SingletonHolder();
        }
        return instance;
    }

   //set getter setter here
}

如果不成功,请随时发表评论

答案 2 :(得分:0)

我将活动A的launchMode更改为singleTop文件中的mainfest,如下所示:

android:launchMode="singleTop"

我在SO上跟踪了这个问题:Setting launchMode="singleTask" vs setting activity launchMode="singleTop"

通过使用此方法,活动A不会被销毁,当我刚刚完成活动B或单击活动B中的向上导航时,活动A的现有实例将再次启动。