Поддержание ServiceConnection в Android через изменения ориентации

У меня есть активность, которая содержит ServiceConnection к службе. Когда ориентация меняется, ServiceConnection теряется и создается заново.

Это не желательно. Я бы хотел, чтобы это было так, чтобы ServiceConnection поддерживался посредством воссоздания Activity. Я ищу хороший шаблон, который решает эту проблему.

3 ответа

Решение

Взгляните на Activity.onRetainNonConfigurationInstance() и связанные методы getLastNonConfigurationInstance() - они могут быть полезны.

К сожалению, использование onRetainNonConfigurationInstance/getLastNonConfigurationInstance может привести к утечкам. В моем случае (я использую IntentService для загрузки файла на удаленный сервер), я объявил свое соединение в рассматриваемой операции, такой как:

private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {
        mServiceMessenger = new Messenger(service);
        mConnectedToService = true;
    }

    public void onServiceDisconnected(ComponentName className) {
        mConnectedToService = false;
        mServiceMessenger = null;
    }
};

MServiceMessenger является экземпляром Messenger, который позволяет мне отправить заказ на отмену в задачу загрузки.

Тем не менее, когда я тестировал решение с использованием onRetainNonConfigurationInstance и getLastNonConfigurationInstance, я проследил (благодаря плагину MAT в Eclipse), что поворот экрана связан с множеством утечек из моего контекста Activity.

Чтобы решить эту проблему (и поскольку моя сложность приложения позволяет мне это делать), я создал одноэлементную группу, объединяющую все элементы, которые мне нужны для обработки соединения с моим IntentService (и связи с моей деятельностью). Таким образом, при повороте экрана новое созданное действие возвращает соединение, управляемое синглтоном, и может использовать его без потери информации.

Используйте android:configChanges="direction" в свойстве Activity в манифесте.

Другие вопросы по тегам