Сохраняйте ссылку на объект при записи в посылку в Android

У меня есть класс, расширяющий ResultReceiver. Когда я начинаю свою основную деятельность, в методе onCreate я вызываю IntentService для получения некоторых данных из Интернета.

Поскольку мне нужна служба для передачи объектов Movie в основное действие, мне нужно создать экземпляр 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 в качестве дополнительного намерения?

Что нужно, чтобы "написать в посылку"?


person Javier Ventajas Hernández    schedule 09.05.2016    source источник


Ответы (1)


Вы не можете этого сделать, и это правильно, потому что Parcel является независимым от времени объектом - его можно восстановить даже после пересоздания Activity, поэтому ссылка на него изменится.

Вы можете передать ссылку на основное действие через объект Application или какое-либо статическое поле. Это поле будет инициализировано в onCreate активности и использоваться при чтении данных из посылки.

person Artem Mostyaev    schedule 12.05.2016