关于android:实现需要上下文的Parcelable类

Implementing Parcelable Class That Requires Context

我希望我的数据类实现Parcelable,以便可以在Activity之间共享它,但是它也需要引用Context,以便可以将字段保存到SQLiteDatabase。

但是,这是一个问题,因为Parcelable.Creator方法createFromParcel仅具有一个参数Parcel。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public abstract class Record implements Parcelable {

protected Context context;
protected String value;

public Record(Context context) {
    this.context = context;
}

public Record(Parcel parcel) {
    this.value = parcel.readString();
}

public void save() {
    //save to SQLiteDatabase which requires Context
}

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

@Override
public void writeToParcel(Parcel parcel, int flag) {
    parcel.writeString(value);
}

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
    public Record createFromParcel(Parcel parcel) {
        return new Record(in);
    }

    public Record[] newArray(int size) {
        return new Record[size];
    }
};
}

实现Parcelable的类还如何引用Context,以便将其保存到SQLiteDatabase?


Parcelable接口类似于Java接口Serializable。实现此接口的对象应可序列化。这意味着应该可以将对象转换为可以保存在文件中的表示形式,例如

很容易使用字符串,int,float或double等,因为它们都具有字符串表示形式。 Context类显然不可序列化和不可打包,因为例如它可以是一个Activity。

如果要将活动状态保存到数据库中,则应该找到另一种方法。


您的Record类可能实际上不需要访问SQL数据库。原因恰恰就是您现在遇到的问题:将上下文重新注入到每个Record中非常困难。

也许更好的解决方案是实现具有方法save(Record r)的静态RecordSQLService。您的应用程序可以在启动时启动RecordSQLService,因此只要您的应用程序运行,它就会一直保持活动状态,并且它有保存Record类的责任,这使它不再需要Context和可以打包。