Поддержание 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 в манифесте.