Ответ 1
Безопасен ли этот метод для вызова произвольных объектов (в некотором смысле что я могу быть уверен, что он будет вызван, и что это не будет устарели или удалены в ближайшее время)?
onRetainCustomNonConfigurationInstance()
- относительно новый метод, и он не устарел. Я бы предположил, что скоро это не исчезнет, потому что нет причин вводить что-то новое, просто чтобы удалить его. Вы можете использовать его безопасно.
Как этот метод отличается от onRetainNonConfigurationInstance(), который также должен возвращать Object, и по существу должен работать аналогично?
onRetainNonConfigurationInstance()
всегда возвращает экземпляр внутреннего класса NonConfigurationInstances
с сохраненными фрагментами, загрузчиками и т.д. Вы не можете (и не должны) изменять это поведение системы. Поэтому метод final
, и вы не можете его переопределить.
Если вы хотите сохранить свой собственный экземпляр, вам нужно переопределить onRetainCustomNonConfigurationInstance()
и вернуть его оттуда.
Фактически, onRetainNonConfigurationInstance()
вызывает onRetainCustomNonConfigurationInstance()
и сохраняет перенастроенный экземпляр с другими состояниями, такими как сохраненные фрагменты и загрузчики.
По какой-то причине лучше использовать сохранившийся фрагмент?
Это скорее вопрос вашего прецедента и предпочтений. Логика может быть такой. Если ваша деятельность просто контролирует фрагменты и не имеет в ней никакой другой специальной логики, то легче использовать сохранившиеся фрагменты. Если у вашей деятельности есть что-то, что нужно сохранить, вы можете безопасно использовать метод onRetainCustomNonConfigurationInstance()
. На данный момент в обоих случаях состояние по-прежнему сохраняется старым и устаревшим способом onRetainNonConfigurationInstance()
.
p.s. Что касается вопроса о бонусе о сохранении состояния, я бы предпочел рассмотреть метод onSaveInstanceState(). Он предназначался для хранения состояний.