在Android中写入parcel时保持对象引用

时间:2016-05-09 22:08:12

标签: android android-intent parcelable intentservice parcel

我有一个扩展ResultReceiver的类。当我开始我的主要活动时,在onCreate方法上,我调用一个IntentService来从互联网上获取一些数据。

由于我需要服务将Movie对象传递给main活动,因此我需要在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成员变量将设置为我的主要活动,因为它将使用服务将获取的数据。

我的问题是:

当我将ResultReceiver作为intent extra传递时,如何维护对主活动的引用?

我需要什么&#34;写入包裹&#34;?

1 个答案:

答案 0 :(得分:1)

你不能这样做是正确的,因为Parcel是与时间无关的对象 - 即使在重新创建Activity之后也可以恢复它,因此对它的引用将会改变。 / p>

您可以通过Application对象或某个静态字段传递对主要活动的引用。该字段将在活动onCreate中初始化,并在从包裹中读取数据时使用。