Вопрос о том, какой метод лучше, во многом зависит от того, какую информацию вы храните и к которой вам нужен доступ, и кому (какие компоненты, пакеты и т. Д.) Нужен доступ к этой информации.Кроме того, такие настройки, как launchMode
и configChanges
, которые изменяют жизненный цикл, могут помочь вам определить, какой метод лучше для вас.
Во-первых, позвольте мне заметить, что я большой сторонник расширения объекта Application.и часто расширяйте класс Application, но принимайте все, что здесь указано, в его контексте, так как важно понимать, что существуют обстоятельства, когда это просто не выгодно.
В жизненном цикле приложения: Чуббард в основном правильно заявил, что приложение имеет тот же срок службы, что и компонент Singleton.Хотя они очень близки, есть небольшие отличия.Само приложение рассматривается ОС как ОС Singleton и остается активным до тех пор, пока активен ЛЮБОЙ компонент, включая AppWidget (который может существовать в другом приложении) или ContentResolver.
Все ваши компоненты в конечном итоге получают доступ к одному и тому же объекту, даже если они находятся в нескольких заданиях или процессах.Тем не менее, это не гарантируется, что это останется таким навсегда (поскольку приложение не является на самом деле синглтоном), и гарантируется только в Google Android, а не в переопределенных выпусках производителя.Это означает, что с некоторыми объектами в объекте приложения следует обращаться осторожно.
Ваш объект Application
не умрет, если все ваши компоненты также не будут уничтожены.Тем не менее, Android имеет возможность убить любое количество компонентов.Это означает, что у вас никогда не будет гарантированно иметь Application
объект, но если какой-либо из ваших компонентов жив, то есть Application
, чтобы связать его с.
Еще одна приятная вещь о Application
заключается в том, что он не связан с компонентами, которые работают.Ваши компоненты связаны с этим, тем не менее, что делает его чрезвычайно полезным.
Что следует избегать в объекте приложения:
- В соответствии с обычным, избегайте статических
Context
s.На самом деле, часто вам вообще не следует хранить здесь Context
, потому что Application
сам по себе Context
. - Большинство методов здесь должны быть статическими, потому что вы не гарантированно получите тот же самый объект
Application
, даже если это крайне вероятно. - Если вы переопределите
Application
, типВаши данные и методы, хранящиеся здесь, помогут вам в дальнейшем определить, нужно ли вам создавать компонент Singleton или нет. Drawables
и его производные с наибольшей вероятностью могут «просочиться», если не позаботиться о них, поэтомуздесь также рекомендуется избегать ссылок на Drawables
. - Состояние выполнения любого отдельного компонента.Это потому что, опять же, вы не гарантированно получите тот же самый объект
Application
.Кроме того, ни одно из событий жизненного цикла, которые происходят в Activity
, не доступно здесь.
Вещи для хранения в Приложении (через Пакет)
Application
- это отличное место для хранения данных и методов, которые должны совместно использоваться компонентами, особенно если у вас есть несколько точек входа (несколько компонентов, которые можно запускать и запускать вне действия запуска).Например, во всех моих Application
я размещаю свои теги DEBUG и код журнала.
Если у вас есть ContentProvider или BroadcastReceiver, это делает Application
еще более идеальным, поскольку у них есть небольшие жизненные циклы, которыене «возобновляемый», как Activity
или AppWidgetProvider
, и теперь может получать доступ к этим данным или методам.
Предпочтения используются, как правило, для определения параметров запуска по нескольким запускам, поэтому это может быть отличным местом дляНапример, обработайте ваш SharedPreferences
одним доступом, а не одним на компонент.На самом деле, все, что «сохраняется» во время нескольких прогонов, прекрасно для доступа.
Наконец, одним из основных упущенных преимуществ является то, что вы можете хранить и организовывать свои константы здесь без необходимости загружать другой класс или объект, потому что ваш Application
всегда работает, если один из ваших компонентов работает. Это особенно полезно для намеренных действий и сообщений об исключениях и других подобных типов констант.
Вещи для хранения в Bundle, а не в приложении
Состояние во время выполнения, которое зависит от наличия или состояния одного компонента или одного запуска компонента. Кроме того, все, что зависит от состояния отображения, ориентации или аналогичных служб Android, здесь не является предпочтительным. Это потому, что Application
никогда не уведомляется об этих изменениях. Наконец, все, что зависит от уведомлений от этой системы Android, не должно размещаться здесь, например, реакция на события жизненного цикла.
И .... В другом месте
Что касается других данных, которые необходимо сохранить, у вас всегда есть базы данных, сетевые серверы и файловая система. Используйте их, как всегда.
Как бы ни были полезны и не замечены Application
, хорошее понимание важно, поскольку оно не идеально. Надеемся, что эти разъяснения дадут вам немного понимания относительно того, почему гуру поощряют один путь над другим. Поймите, что у многих разработчиков есть подобные потребности, и большинство инструкций основано на том, какие методы и знания есть у большинства сообщества. Ничто из того, что говорит Google, не относится ко всем потребностям программиста, и есть причина, по которой приложение не было объявлено Final
.
Помните, есть причина, по которой Android должен убивать ваши компоненты. И основная причина - память, а не обработка. Используя Приложение, как описано выше, и разрабатывая соответствующие методы для сохранения соответствующей информации, вы можете создавать более сильные приложения, которые важны для Системы, Пользователя, его родственных компонентов и других разработчиков. Использование информации, предоставленной всеми здесь, должно дать вам отличное руководство о том, как и когда расширять ваш Application
.
Надеюсь, это поможет,
FuzzicalLogic