2015-09-15 38 views
2

我刚刚开始使用Android和我遇到了以下问题:savedInstanceState没有被恢复

我想saveInstanceState新的活动打开时,我需要恢复状态时,活动已恢复可见状态。

这里是我的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()); 
} 

这是我的。如果您发现应该恢复以前保存的实例状态

@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方法onCreate方法,之后我救实例我在保存的实例上做了toString(),它显示了我保存的值的完整实例。但是,当我恢复实例时,savedInstanceState变量为空。

我使用,其中每个对象实现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 + 
      '}'; 
} 

} 

我觉得我在错误的道路不知何故保存。我按照教程介绍了如何做到这一点。请让我知道我做错了什么。谢谢

enter image description here

+0

所以你看到'EMPTY STATE'消息呢?如果这些都是愚蠢的问题,我很抱歉。 –

+0

@PaulBoddington是的,它总是跳转到别的,因为实例总是空 – Jenny

+1

我还没有很详细的研究,但在快速浏览你的代码看起来是正确的。除非系统试图恢复用户导航远离的“活动”,否则'Bundle'' savedInstanceState'总是'null'。如果您的应用程序可以打开2个不同的相同'Activity'的实例,则它不会使用1st中的包创建第二个实例。我通常将持久数据保存在'onPause'中。 –

回答

1

我的问题是由清单文件添加到在MainActivity解决。

android:launchMode="singleTop" 

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