在 Android 中写入包裹时维护对象引用
Maintain an object reference when writing to parcel in Android
我有一个扩展 ResultReceiver 的 class。当我启动 main activity 时,在 onCreate 方法上,我调用 IntentService 从互联网上获取一些数据。
由于我需要将 Movie 对象传递给主 activity 的服务,因此我需要在 activity 中实例化 ResultReceiver 并将其传递给服务。
final class MovieResultReceiver extends ResultReceiver {
private static final String MOVIE_ARRAY = "movie array";
private static final int RESULT_SUCCESS= 101000;
private ResultProcessor mProcessor;
MovieResultReceiver(Handler handler) {
super(handler);
}
interface ResultProcessor {
void onReceiveResult(int resultCode, Bundle resultData);
}
void setReceiver(ResultProcessor resultProcessor) {
mProcessor = resultProcessor;
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (mProcessor != null) {
mProcessor.onReceiveResult(resultCode, resultData);
}
}
void notifyReceiver(Bundle bundle, Parcelable[] parcelables) {
bundle.putParcelableArray(MOVIE_ARRAY,parcelables);
send(RESULT_SUCCESS,bundle);
}
private MovieResultReceiver(Parcel in) {
super(new Handler());
}
static final Creator<MovieResultReceiver> CREATOR = new Creator<MovieResultReceiver>() {
@Override
public MovieResultReceiver createFromParcel(Parcel source) {
return new MovieResultReceiver(source);
}
@Override
public MovieResultReceiver[] newArray(int size) {
return new MovieResultReceiver[0];
}
};
@Override
public void writeToParcel(Parcel dest, int flags) {
// I need to pass a reference to MainActivity,
// so I need to write it to the parcel somehow
}
}
ResultProcessor 成员变量将设置为我的 Main Activity,因为它将使用服务将获取的数据。
我的问题是:
当我将 ResultReceiver 作为 intent extra 传递时,如何维护对主要 activity 的引用?
我需要什么"write to parcel"?
你不能这样做,这是正确的,因为 Parcel
是与时间无关的对象 - 即使在 Activity
重新创建后它也可以恢复,所以对它的引用会改变。
您可以通过 Application
对象或某些静态字段传递对 Main Activity 的引用。该字段将在 activity 的 onCreate
中初始化,并在从包裹中读取数据时使用。
我有一个扩展 ResultReceiver 的 class。当我启动 main activity 时,在 onCreate 方法上,我调用 IntentService 从互联网上获取一些数据。
由于我需要将 Movie 对象传递给主 activity 的服务,因此我需要在 activity 中实例化 ResultReceiver 并将其传递给服务。
final class MovieResultReceiver extends ResultReceiver {
private static final String MOVIE_ARRAY = "movie array";
private static final int RESULT_SUCCESS= 101000;
private ResultProcessor mProcessor;
MovieResultReceiver(Handler handler) {
super(handler);
}
interface ResultProcessor {
void onReceiveResult(int resultCode, Bundle resultData);
}
void setReceiver(ResultProcessor resultProcessor) {
mProcessor = resultProcessor;
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (mProcessor != null) {
mProcessor.onReceiveResult(resultCode, resultData);
}
}
void notifyReceiver(Bundle bundle, Parcelable[] parcelables) {
bundle.putParcelableArray(MOVIE_ARRAY,parcelables);
send(RESULT_SUCCESS,bundle);
}
private MovieResultReceiver(Parcel in) {
super(new Handler());
}
static final Creator<MovieResultReceiver> CREATOR = new Creator<MovieResultReceiver>() {
@Override
public MovieResultReceiver createFromParcel(Parcel source) {
return new MovieResultReceiver(source);
}
@Override
public MovieResultReceiver[] newArray(int size) {
return new MovieResultReceiver[0];
}
};
@Override
public void writeToParcel(Parcel dest, int flags) {
// I need to pass a reference to MainActivity,
// so I need to write it to the parcel somehow
}
}
ResultProcessor 成员变量将设置为我的 Main Activity,因为它将使用服务将获取的数据。
我的问题是:
当我将 ResultReceiver 作为 intent extra 传递时,如何维护对主要 activity 的引用?
我需要什么"write to parcel"?
你不能这样做,这是正确的,因为 Parcel
是与时间无关的对象 - 即使在 Activity
重新创建后它也可以恢复,所以对它的引用会改变。
您可以通过 Application
对象或某些静态字段传递对 Main Activity 的引用。该字段将在 activity 的 onCreate
中初始化,并在从包裹中读取数据时使用。