如何为接口实现Parcelable接口?单方法接口实现示例
如何让单方法接口的实现类支持Parcelable?
嘿,这个问题问得很到位!首先得明确:接口本身没法直接实现Parcelable——因为Parcelable本身也是个接口,你得让实现这个业务接口的具体类,同时去实现Parcelable接口才行。
假设我们有一个仅包含单个方法的接口,比如这样:
// 定义你的业务接口 public interface MyDataProvider { // 接口唯一的方法:获取一段数据 String getProvidedData(); }
接下来,我们需要写一个具体的实现类,同时实现这个业务接口和Parcelable。下面是完整的示例代码,每一步都标注了作用:
// 实现类同时继承业务接口和Parcelable public class DataProviderImpl implements MyDataProvider, Parcelable { // 存储接口方法需要返回的数据 private String data; // 常规构造方法,用于平时创建对象 public DataProviderImpl(String data) { this.data = data; } // 🔴 Parcelable要求的核心构造方法:从Parcel中读取数据重建对象 protected DataProviderImpl(Parcel in) { // 按写入顺序读取对应类型的数据 data = in.readString(); } // 🟢 实现业务接口的唯一方法 @Override public String getProvidedData() { return data; } // 🟡 Parcelable要求的方法:返回内容描述,绝大多数场景返回0即可 @Override public int describeContents() { return 0; } // 🟠 Parcelable要求的方法:把对象数据写入Parcel,供后续序列化传递 @Override public void writeToParcel(Parcel dest, int flags) { // 按顺序写入数据,和构造方法的读取顺序要对应 dest.writeString(data); } // 🔵 必须的静态CREATOR常量:Parcelable框架用它来创建对象实例 public static final Creator<DataProviderImpl> CREATOR = new Creator<DataProviderImpl>() { @Override public DataProviderImpl createFromParcel(Parcel in) { return new DataProviderImpl(in); } @Override public DataProviderImpl[] newArray(int size) { return new DataProviderImpl[size]; } }; }
额外注意点:传递接口类型对象的小技巧
如果你的代码里是用接口类型(比如MyDataProvider)来引用对象的,在通过Intent/Bundle传递时,需要先强转成Parcelable,接收时再转回来:
// 发送端 MyDataProvider provider = new DataProviderImpl("这是要传递的数据"); Intent intent = new Intent(this, TargetActivity.class); intent.putExtra("PROVIDER_KEY", (Parcelable) provider); // 接收端 MyDataProvider receivedProvider = (MyDataProvider) getIntent().getParcelableExtra("PROVIDER_KEY");
如果你的接口有多个实现类,还可以在writeToParcel时额外写入一个类型标识(比如int),读取时根据标识创建对应的实现类,这样就能兼容多实现的场景啦。
内容的提问来源于stack exchange,提问作者sidpal7747
相关产品推荐
相关产品推荐

