当parentActivityName填充时,Android - savedInstanceState为null

时间:2016-09-17 00:37:44

标签: android android-navigation

我有一个Activity通过调用startActivity()来调用另一个,在调用onSaveInstanceState(Bundle outState)一段时间后我设置了一个布尔值valeu以在onCreate(Bundle savedInstanceState)上恢复,但是当调用此方法时savedInstanceState为空。我在互联网上搜索了一个答案,但没有为我的案例找到任何答案。

以下是onSaveInstanceState方法:

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState = new Bundle();
        outState.putBoolean(Constants.MAIN_ACTIVITY_STATE_RECREATED, true);
        super.onSaveInstanceState(outState);
    }

onCreate

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setTitle(R.string.activity_main);
    if (savedInstanceState!=null && savedInstanceState.getBoolean(Constants.MAIN_ACTIVITY_STATE_RECREATED, false)){
        return;
    }
    //DO SOME STUFF
}

这是我的AndroidManifest活动宣言:

   <activity android:name=".MainActivity"
              android:screenOrientation="portrait"
              android:configChanges="orientation|keyboardHidden">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>

            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

这叫做活动:

       <activity android:name=".PhotoUserActivity"
                  android:screenOrientation="portrait"
                  android:configChanges="orientation|keyboardHidden"
            android:parentActivityName=".MainActivity">
        </activity>

如果我从第二个活动的声明中删除parentActivityName并自己制作“后退按钮”,则永远不会调用第一个Activity的onCreate。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您无需初始化outState变量,否则您将无法传递该值。

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        //outState = new Bundle(); <-- Remove this
        super.onSaveInstanceState(outState);
        outState.putBoolean(Constants.MAIN_ACTIVITY_STATE_RECREATED, true);
    }

outState Bundle由框架提供,通过初始化它,例如new Bundle()如果它包含任何值Bundle,您可能会删除之前的super.onSaveInstanceState(Bundle outState)

始终建议在添加新值之前先调用try: connection.execute(my_table.insert(), records) except DatabaseError as e: connection.execute(my_table.insert(), records)

答案 1 :(得分:1)

如果您将应用程序的状态保存在一个包中(通常是onSaveInstanceState中的非持久性动态数据),如果需要重新创建活动,则可以将其传递回onCreate(例如,方向改变)这样你就不会丢失这些先前的信息。如果未提供任何数据,则savedInstanceState为空。

  

...你   应该使用onPause()方法来编写任何持久数据(例如   用户编辑)到存储。另外,该方法   在放置活动之前调用onSaveInstanceState(Bundle)   这样的背景状态,可以让你省去任何动态   实例状态在您的活动中进入给定的Bundle,稍后   如果需要重新创建活动,则在onCreate(Bundle)中收到。   有关如何使用的更多信息,请参阅“进程生命周期”部分   流程的生命周期与其托管的活动相关联。注意   将持久数据保存在onPause()而不是   onSaveInstanceState(Bundle)因为后者不属于   生命周期回调,因此不会在每种情况下调用   在其文档中描述。

source