主要是因为发送意图的整个过程并不是那么简单。意图可以通过系统,在进程之间等...简而言之,您创建的对象与最后收到的对象不同(如果尝试扩展意图类,将其发送到另一个活动并尝试将其转换回另一端的扩展类,它根本不是同一个对象)。
现在我也很讨厌这个,这就是为什么我创建了一些基类来帮助我处理意图(我称之为 BundleWrappers),它们可以像这样工作:
您使用 getter/setter 创建一个 POJO,填充该对象并随心所欲地使用它,
然后当时机成熟时,只需将其序列化为一个包并将其反序列化为另一端的同一对象。
那么您将在其他活动中拥有与 getter 和 setter 相同的对象。
意图糟糕的主要原因是您必须找到一种方法来跟踪附加组件的所有键,以及序列化捆绑包的附加实现。
即使使用我的方法,它也不容易使用意图,但它是迄今为止我在性能和对象组织方面发现的最好的。
public abstract class BundleWrapper implements Parcelable {
protected static final String KEY_PARCELABLE = "key_parcelable";
public static final String TAG = BundleWrapper.class.getSimpleName();
public BundleWrapper() {
super();
}
abstract Parcelable getParcelable();
public Bundle toBundle(){
final Bundle bundle = new Bundle();
Parcelable parcelable = getParcelable();
if (parcelable != null) {
bundle.setClassLoader(parcelable.getClass().getClassLoader());
bundle.putParcelable(KEY_PARCELABLE, parcelable);
}
return bundle;
}
public static Object fromBundle(final Intent intent) {
return fromBundle(intent.getExtras());
}
public static Object fromBundle(final Bundle bundle) {
if (bundle != null && bundle.containsKey(KEY_PARCELABLE)) {
bundle.setClassLoader(BundleWrapper.class.getClassLoader());
return bundle.getParcelable(KEY_PARCELABLE);
}
return null;
}
}
这是我的基类,要使用它,您只需扩展它并实现 parcelable(过程的延迟部分 :):
public class WebViewFragmentBundle extends BundleWrapper implements Parcelable {
public static final String TAG = WebViewFragmentBundle.class.getSimpleName();
private String url;
public WebViewFragmentBundle() {
super();
}
public WebViewFragmentBundle(Parcel source) {
this.url = source.readString();
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@Override
Parcelable getParcelable() {
return this;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(url);
}
public static final Parcelable.Creator<WebViewFragmentBundle> CREATOR = new Parcelable.Creator<WebViewFragmentBundle>() {
@Override
public WebViewFragmentBundle createFromParcel(Parcel source) {
return new WebViewFragmentBundle(source);
}
@Override
public WebViewFragmentBundle[] newArray(int size) {
return new WebViewFragmentBundle[size];
}
};
}
对于一个用例:
public static void launchAugmentedRealityActivityForResult(final Activity context, WebViewFragmentBundle wrapper) {
final Intent intent = new Intent(context, Augmented.class);
intent.putExtras(wrapper.toBundle());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
context.startActivityForResult(intent, AUGMENTED_RESULT_CODE);
}
并将其投射到另一端,例如:
(WebViewFragmentBundle)BundleWrapper.fromBundle(getIntent());