Android 如何在停止应用程序的情况下保持列表的持久性?

Android 如何在停止应用程序的情况下保持列表的持久性?,android,Android,我正在制作我的第一个Android应用程序,但我使用的列表出现了问题。该列表由应用程序填充,用户可以向其中添加新项目 一切正常,直到我停止应用程序并再次启动它。用户的项目不存在 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); expListView = (Expanda

我正在制作我的第一个Android应用程序,但我使用的列表出现了问题。该列表由应用程序填充,用户可以向其中添加新项目

一切正常,直到我停止应用程序并再次启动它。用户的项目不存在

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    expListView = (ExpandableListView) findViewById(R.id.expandableListView);
    prepareListData();

    listAdapter = new ExpandableListAdapter(this, g.getListDataHeader(), g.getListDataChild());
    expListView.setAdapter(listAdapter);
}


@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    savedInstanceState.putStringArrayList("medicineHeaderList", g.getListDataHeader());
    savedInstanceState.putSerializable("medicineHashMap", g.getListDataChild());
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    Globals g = Globals.getInstance();
    g.setListDataHeader(savedInstanceState.getStringArrayList("medicineHeaderList"));
    g.setListDataChild((HashMap<String, Medicine>) savedInstanceState.getSerializable("medicineHashMap"));
}

private void prepareListData() {

    g = Globals.getInstance();
    // Adding child data
    if (g.getListDataHeader().isEmpty()) {
        g.addToList("someMed");
        g.addToList("someMed2");

        g.putToHashMap(g.getListDataHeader().get(0), new Medicine("someMed", "someComp", 2, new BigDecimal("20.55")));
        g.putToHashMap(g.getListDataHeader().get(1), new Medicine("someMed2", "someComp2", 4, new BigDecimal("15.20")));
    }
}
}

以及:

公共类全局变量{
私有静态全局实例=null;
私有ArrayList listDataHeader=新ArrayList();
私有HashMap listDataChild=新HashMap();
私有全局函数(){}
public void addToList(字符串medicineName){
getListDataHeader().add(medicineName);
}
公共无效putToHashMap(字符串键,医学值){
getListDataChild().put(键,值);
}
公共ArrayList getListDataHeader(){
返回listDataHeader;
}
公共HashMap getListDataChild(){
返回listDataChild;
}
公共静态同步全局getInstance(){
if(实例==null){
instance=newglobals();
}
返回实例;
}
公共无效setListDataHeader(ArrayList listDataHeader){
this.listDataHeader=listDataHeader;
}
public void setListDataChild(HashMap listDataChild){
this.listDataChild=listDataChild;
}
}
有一些东西来自混合教程和堆栈溢出答案,我努力使这项工作,但我不能,我不能在这里找到我的错误。为什么在我关闭应用程序时它不保存实例

我现在觉得我根本不明白它应该如何工作以及应该神奇地保存在哪里。

onSaveInstanceState()和onRestoreInstanceState()方法并不意味着永久保存数据。它们用于因配置更改或为恢复系统内存而终止活动时重新创建活动。从:

当您的活动因用户按Back键或 活动自行完成,系统对该活动的概念 实例将永远消失,因为该行为指示该活动 不再需要了。但是,如果系统由于 到系统约束(而不是正常的应用程序行为),然后 实际的活动实例消失了,系统会记住它 存在,因此如果用户导航回它,系统将创建 使用一组保存的数据创建活动的新实例 描述活动被销毁时的状态

如果您想永久保存数据,应该考虑使用SQLite数据库或将数据保存到SharedReferences

public class Medicine implements Serializable {

private String name;
private String company;
private int dosage;
private BigDecimal price;

public Medicine (String name, String company, int dosage, BigDecimal price) {
    this.name = name;
    this.company = company;
    this.dosage = dosage;
    this.price = price;
}

public int hashCode() {
    return new HashCodeBuilder(2, 31).
            append(getName()).
            append(getCompany()).
            append(getDosage()).
            append(getPrice()).
            toHashCode();
}

public boolean equals(Object obj) {
    if (!(obj instanceof Medicine))
        return false;
    if (obj == this)
        return true;

    Medicine rhs = (Medicine) obj;
    return new EqualsBuilder().
            append(getName(), rhs.getName()).
            append(getCompany(), rhs.getCompany()).
            append(getDosage(), rhs.getDosage()).
            append(getPrice(), rhs.getPrice()).
            isEquals();
}


private void writeObject(ObjectOutputStream oos) throws IOException {
    oos.defaultWriteObject();
    List medicine = new ArrayList();
    medicine.add(name);
    medicine.add(company);
    medicine.add(dosage);
    medicine.add(price);
    oos.writeObject(medicine);
}

private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
    ois.defaultReadObject();
    List medicine = (List)ois.readObject();
    name = (String) medicine.get(0);
    company = (String) medicine.get(1);
    dosage = (Integer) medicine.get(2);
    price = (BigDecimal) medicine.get(3);
}


public String getName() {
    return name;
}

public String getCompany() {
    return company;
}

public int getDosage() {
    return dosage;
}

public BigDecimal getPrice() {
    return price;
}
public class Globals {

private static Globals instance = null;
private ArrayList<String> listDataHeader = new ArrayList<String>();
private HashMap<String, Medicine> listDataChild = new HashMap<String, Medicine>();

private Globals(){}

public void addToList(String medicineName) {
    getListDataHeader().add(medicineName);
}

public void putToHashMap(String key, Medicine value) {
    getListDataChild().put(key, value);
}

 public ArrayList<String> getListDataHeader() {
    return listDataHeader;
}

public HashMap<String, Medicine> getListDataChild() {
    return listDataChild;
}

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

public void setListDataHeader(ArrayList<String> listDataHeader) {
    this.listDataHeader = listDataHeader;
}

public void setListDataChild(HashMap<String, Medicine> listDataChild) {
    this.listDataChild = listDataChild;
}
}