Android:Activity onCreate savedInstanceState allways为null

时间:2016-11-07 06:24:05

标签: android activity-lifecycle onsaveinstancestate

所以,我知道问题是重复的,但我没有在这些答案中找到解决方案。 我有一个MainActivity和GameDetailActivity。 GameAetailActivity的MainActivity层次结构父级。这是清单文件中的声明:

    <activity
        android:name=".MainActivity"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme2"
        android:noHistory="false"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>

            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    <activity
        android:name=".GameDetailActivity"
        android:theme="@style/AppTheme2"
        android:parentActivityName=".MainActivity"
        android:noHistory="false"
        >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="de.exam.example.MainActivity"/>
    </activity>

这里AppTheme2声明:

<style name="AppTheme2" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="android:windowActionBar">false</item>
    <item name="android:windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>

    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

这里回到GameDetailActivity中的逻辑:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            Intent upIntent = NavUtils.getParentActivityIntent(this);
            if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
                TaskStackBuilder.create(this)
                        .addNextIntentWithParentStack(upIntent)
                        .startActivities();
            } else {
                NavUtils.navigateUpTo(this, upIntent);
            }
            return true;
        default:break;
    }
    return super.onOptionsItemSelected(item);
}

当我在GameDetailActivity中按下home(返回“&lt; - ”)按钮时,我总是在MainActivity中将savedInstanceState设为null。我不明白为什么保存的数据在MainActivity中丢失了。

修改

这里启动GameDetailActivity代码:

Intent i = new Intent(getActivity(), GameDetailActivity.class);
i.putExtra("game", clickedGame);
startActivity(i);

有人知道如何解决这个问题吗?

提前谢谢

3 个答案:

答案 0 :(得分:1)

使用新的后台进行导航

  

用户在输入活动后按下向上按钮   另一个应用程序的任务,您的应用程序启动new task with相应的任务   在导航之前回到堆栈。

<强>解决方案

导航至家长活动

  

当您调用此方法时,它将完成当前活动并启动   (or resumes)适当的父活动。如果是目标父母   活动在任务的后台堆栈中,它是brought forward.方式   提出取决于父母活动是否能够   处理onNewIntent()调用。

Source

   @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        // Respond to the action bar's Up/Home button
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

答案 1 :(得分:1)

  

如果设置,则正在启动的活动已在运行中   当前任务,然后而不是启动它的新实例   活动,其上的所有其他活动将被关闭   这个意图将作为一个传递到(现在在顶部)旧活动   新的意图。   愿这可以解决你的问题

public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId()== android.R.id.home) {
        Intent intent = NavUtils.getParentActivityIntent(this);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        NavUtils.navigateUpTo(this, intent);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

答案 2 :(得分:1)

@NgModule({ imports: [ BrowserModule ], declarations: [ App, Parent, Transcluded1, Transcluded2 ], providers: [ {provide: TranscludedBase, useExisting: Transcluded1, multi:true} {provide: TranscludedBase, useExisting: Transcluded2, multi:true} ], bootstrap: [ App ] }) 捆绑包已保存在savedInstanceState

当操作系统销毁onSaveInstanceState()(例如回收资源,或者由于配置更改)时,会调用

onSaveInstanceState(),不能保证只需通过浏览活动就可以调用它。