Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
class IdentityParcelable implements Serializable {
private static HashMap<UUID, Object> cache = new HashMap<>();
private static HashMap<Object, UUID> reverseCache = new HashMap<>();
private UUID id;
public IdentityParcelable() {
}
public IdentityParcelable(Object o) {
if (reverseCache.containsKey(o)) {
id = reverseCache.get(o);
} else {
id = UUID.randomUUID();
cache.put(id, o);
reverseCache.put(o, id);
}
}
public Object getObject() {
return cache.get(id);
}
}
public class MiddleActivity extends Activity {
private Object object;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
object = new Object();
} else {
object = ((IdentitySerializable) savedInstanceState.getSerializable(OBJECT_KEY)).getObject();
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable(OBJECT_KEY, new IdentitySerializable(object));
}
}
IdentityParcelable createFromParcel(Parcel source)
— не вызывается чтобы я ни делал. Такое ощущение, что Bundle хранит ссылку на Parcelable, и игнорирует все что записали в Parcel.public class IdentityParcelable implements Parcelable {
public static final Parcelable.Creator<IdentityParcelable> CREATOR = new Creator<IdentityParcelable>() {
@Override
public IdentityParcelable createFromParcel(Parcel source) {
throw new RuntimeException("Not implemented");
}
@Override
public IdentityParcelable[] newArray(int size) {
throw new RuntimeException("Not implemented");
}
};
public final Object content;
public IdentityParcelable(Object content) {
this.content = content;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
}
}

В некоторых случаях сериализация/десериализация объекта Parcelable может не проводиться
Intent intent = new Intent(this, BActivity.class);
intent.putExtra("AActivityRecord", new IdentityParcelable(
new WeakReference<?>(getActivityRecord())
));
WeakReference<AActivityRecord> aActivityRecordRef = (WeakReference<AActivityRecord>) ((IdentityParcelable) getIntent().getParcelableExtra("AActivityRecord")).content;
. . .
AActivityRecord aActivityRecord = aActivityRecordRef.get();
if (aActivityRecord != null) {
aActivityRecord.invalidateTaskResult();
}
<!-- res/layout/length_activity.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<TextView
android:id="@+id/statusText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"/>
<EditText
android:id="@+id/sampleField"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button android:id="@+id/calculateLengthButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Calculate Length"/>
</LinearLayout>
Использование android.os.Binder для организации асинхронного взаимодействия в Андроиде