【问题标题】:savedInstanceState is not being restoredsavedInstanceState 未恢复
【发布时间】:2015-09-15 16:56:11
【问题描述】:

我刚开始使用 Android,遇到了以下问题:

我正在尝试在新 Activity 打开时保存InstanceState,当 Activity 回到可见状态时我需要恢复该状态。

这是我的 onSaveInstanceState 方法

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putParcelableArrayList("movies", (ArrayList<Movie>) movies);

    Log.v("onSaveInstanceState ", "SAVING STATE");
    Log.v("Saving State", outState.toString());
}

这是我的 onCreate 方法,应该恢复之前保存的实例状态

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null){
        Log.v("onCreate ", "EXISTING STATE");
        this.movies = savedInstanceState.getParcelableArrayList("movies");
    }else{
        Log.v("onCreate ", "EMPTY STATE");
    }

    setHasOptionsMenu(true);
}

如果您注意到,在 onSaveInstanceState 方法中,在我保存实例后,我对保存的实例执行 toString(),它会向我显示包含我保存的值的完整实例。但是,当我恢复实例时,savedInstanceState 变量为 null。

我正在使用一个自定义对象数组,其中每个对象都实现 Parcelable。

下面是类:

public class Movie implements Parcelable {
private String title;
private String path;
private String overview;
private String releaseDate;
private double vote;

public Movie(String title, String overview, double vote, String releaseDate, String path) {
    this.title = title;
    this.overview = overview;
    this.vote = vote;
    this.releaseDate = releaseDate;
    this.path = path;
}

public String getTitle() {
    return title;
}

public String getPath() {
    return path;
}

public String getOverview() {
    return overview;
}

public String getReleaseDate() {
    return releaseDate;
}

public double getVote() {
    return vote;
}

protected Movie(Parcel source){
    this.title = source.readString();
    this.path = source.readString();
    this.overview = source.readString();
    this.releaseDate = source.readString();
    this.vote = source.readDouble();

}

public static final Creator<Movie> CREATOR = new Creator<Movie>() {
    @Override
    public Movie createFromParcel(Parcel source) {
        return new Movie(source);
    }

    @Override
    public Movie[] newArray(int size) {
        return new Movie[size];
    }
};

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(title);
    dest.writeSerializable(path);
    dest.writeString(overview);
    dest.writeString(releaseDate);
    dest.writeDouble(vote);
}

@Override
public String toString() {
    return "Movie{" +
            "title='" + title + '\'' +
            ", path='" + path + '\'' +
            ", overview='" + overview + '\'' +
            ", releaseDate='" + releaseDate + '\'' +
            ", vote=" + vote +
            '}';
}

}

我觉得我以某种错误的方式保存它。我遵循了如何做到这一点的教程。请让我知道我做错了什么。谢谢

【问题讨论】:

  • 那么您会看到EMPTY STATE 消息吗?如果这些是愚蠢的问题,我很抱歉。
  • @PaulBoddington 是的,它总是跳转到 else,因为实例总是为空
  • 我没有仔细研究过它,但是快速浏览一下你的代码看起来是正确的。 Bundle savedInstanceState 始终为 null,除非系统试图恢复用户导航离开的 Activity。如果您的应用程序可以打开相同 Activity 的 2 个不同实例,则它不会使用第一个实例中的包创建第二个实例。我通常将持久性数据保存在onPause。
  • @PaulBoddington 绝对不可能有实例。我总是在开始新的运行之前删除旧的。同样在 onCreateView() 方法中只有一个 startActivity(intent)。新活动打开后,我只需单击“返回”箭头即可返回旧活动
  • 在那种情况下我真的很困惑。在子活动上调用finish() 应该会导致父活动恢复。如果在这种情况下调用onCreate(),Bundle 不应该是null,因为系统需要使用它来检索View 层次结构。我认为问题在于您在活动之间移动的方式,而不是您发布的代码。我认为您需要包含启动子活动的代码部分和终止子活动的代码部分。不要包含所有内容 - 仅包含相关部分。

标签: android android-lifecycle


【解决方案1】:

通过添加到清单文件中的 MainActivity 解决了我的问题。

android:launchMode="singleTop"

创建了多个Activity实例,因此不会保存实例。

【讨论】:

    猜你喜欢
    • 2016-06-24
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多