Главная » Разработка для Android » Очистка памяти и жизненные циклы в Android приложении

0

 

Жизнь активности в Android кажется скоротечной и полной опасностей. Процесс активности может быть завершен (killed), а объект Activity – уничтожен (destroyed), казалось бы, по прихоти системы. Кроме того, вам никто не гарантирует, что все требуемые переопределения методов жизненного цикла будут вызваны во время завершения процесса.

Для понимания жизненных циклов в Android целесообразно начать с того, что происходит, когда уничтожается экземпляр Activity и когда завершается процесс.

Уничтожение активности. Активность уничтожается и вызывается метод onDestroy, когда Android хочет сбросить данный экземпляр класса Activity. «Сбросить» в этом случае означает, что система Android обнуляет все ссылки, проставленные на экземпляр Activity. А это значит, что если в вашем коде нет ссылки на данную Activity, то Activity в перспективе попадет в сборку мусора. Слово «уничтожение» в данном случае не совсем точное – фактически оно означает полное стирание.

После вызова метода onDestroy вы можете быть уверены, что данный экземпляр вашего подкласса Activity больше использоваться не будет. Но это еще не означает, что ваше приложение или процесс, в котором оно работает, закончит работу. На самом деле может быть инстанцирован и вызван новый экземпляр того же подкласса Activity. Например, это происходит непосредственно практически сразу же после изменения конфигурации (в частности, после изменения ориентации экрана). В таком случае объект Activity уничтожается для того, чтобы загрузка ресурсов началась заново, уже для новой конфигурации.

Завершение процесса. Когда в системе Android начинается дефицит памяти, она ищет процессы, которые можно было бы завершить. Как правило, приложения Android работают в отдельных процессах. Поэтому сборка мусора, происходящая в одном процессе, не имеет доступа ко всей памяти системы Android. Это означает, что в условиях дефицита памяти Android находит процессы, у которых в текущий момент отсутствуют какие-либо активные компоненты, и завершает (дословно – «убивает») их. В крайних случаях Android завершает и такие процессы, которые имеют используемые компоненты. В простых приложениях процесс становится кандидатом на удаление после того, как к нему будет применен метод onPause. То есть нельзя гарантировать, что другие методы жизненного цикла Activity удастся вызвать после вызова onPause, поскольку Android может срочно понадобиться свободная память, а чтобы ее добыть, придется завершить процесс.

В обоих описанных случаях приложению, по-видимому, придется сохранить какое-либо состояние, которое временно существует в пользовательском интерфейсе приложения. К этому состоянию относится разнообразный пользовательский ввод, который система пока не успела обработать, состояние определенного визуальною индикатора, не входящего в состав модели данных, и т. д. Вот почему все компоненты приложения, и особенно все активности, должны иметь возможность переопределять некоторые методы жизненного цикла.

Источник: Android. Программирование на Java для нового поколения мобильных устройств

По теме:

  • Комментарии