切换活动而不会丢失自定义数据

时间:2018-03-06 17:04:09

标签: android android-intent

目前使用带有startActivity()的Intent在两个共享抽象超类的活动之间切换。但是,每当调用startActivity()时,从抽象超类继承的自定义对象都会被重置。无论如何在startActivity()调用之间维护这个对象?使用OnSavedInstanceState序列化对象不起作用,因为此对象包含LinkedList。

1 个答案:

答案 0 :(得分:0)

每次创建类时,无论它是否扩展超类(在本例中为Activity),都会重新创建超类。您可以扩展Activity以共享常用方法/函数和导入....

您希望远离Serializable,因此您希望对象类实现Parcelable:

public class CustomObject implements Parcelable {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.name);
    }

    public CustomObject() {
    }

    protected CustomObject(Parcel in) {
        this.name = in.readString();
    }

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

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

在第一个活动中,您希望使用Intent将List传递给第二个Activity:

public class StartActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start);
        findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(StartActivity.this, ReceiveDataActivity.class);
                i.putParcelableArrayListExtra("KEY", getCustomObjectList());
                startActivity(i);
            }
        });
    }

    private ArrayList<CustomObject> getCustomObjectList() {
        ArrayList<CustomObject> itemList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            CustomObject customObject = new CustomObject();
            customObject.setName("Name " + i);
            itemList.add(customObject);
        }
        return itemList;
    }
}

然后要获取列表,您将使用getIntent():

public class ReceiveDataActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_receive_data);
        List<CustomObject> itemList = getIntent().getParcelableArrayListExtra("KEY");
        Toast.makeText(this, "List size = " + itemList.size(), Toast.LENGTH_SHORT).show();
    }
}