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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了切换活动而不会丢失自定义数据相关的知识,希望对你有一定的参考价值。

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

答案

每次创建类时,无论它是否扩展超类(在本例中为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();
    }
}

以上是关于切换活动而不会丢失自定义数据的主要内容,如果未能解决你的问题,请参考以下文章

对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段

如何让自定义视图观察包含片段的生命周期事件而不是活动?

在通知单击时启动 Fragment 而不会丢失状态

如何从片段到活动而不会干扰片段的可重用性

如何从片段返回主要活动

将第二个活动的价值保存到第一个活动,而不会丢失更新的数据