Запуск деятельности

В отличие от других парадигм программирования, в котором приложения запускаются с помощью метода main() , Android система инициирует код в экземпляре Activity , вызывая конкретные методы обратного вызова, которые соответствуют конкретным этапам ее жизненного цикла. Существует последовательность методов обратного вызова, которые запускают деятельность, и последовательность методов обратного вызова, которые уничтожают деятельность.

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

Понимание обратных вызовов жизненного цикла

Во время жизни вашей деятельности, система вызывает базовый набор методов жизненного цикла в последовательности, аналогичной ступенчатой ​​пирамиды. То есть, каждый этап жизненного цикла деятельности является отдельным шагом пирамиды. Поскольку система создает новый экземпляр деятельности, каждый метод обратного вызова перемещает состояние деятельности на один шаг вверх. Верхняя часть пирамиды это точка, в которой деятельность работает на переднем плане, и пользователь может взаимодействовать с ней.

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

Рисунок 1. Упрощенная иллюстрация жизненного цикла деятельности, выраженное в виде ступенчатой ​​пирамиды. Она показывает для каждого обратного вызова, используемого для перемещения деятельности на шаг вперед к Resumed (возобновленный) состоянию в верхней части, есть также методы обратного вызова, которые перемещают деятельность на шаг вниз. Деятельность также может вернуться к Resumed состоянию из Paused (приостановленный) и Stopped (остановленный) состояния.

В зависимости от сложности вашей деятельности, вам, вероятно, не нужно реализовывать все методы жизненного цикла. Тем не менее, важно, чтобы вы понимали каждый из них, и реализовали те, которые обеспечивают поведения вашего приложения, как ожидают его пользователи. Правильная реализация ваших методов жизненного цикла деятельности гарантирует, что ваше приложение будет вести себя хорошо в различных ситуациях, в том числе:

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

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

Resumed (возобновлена)
В этом состоянии, деятельность находится на переднем плане, и пользователь может с ней взаимодействовать. (Также иногда это состоянии называется "работает".)
Paused (приостановлена)
В этом состоянии, деятельность частично закрыта другой деятельностью — другая деятельность находится в переднем плане, полупрозрачна или не покрывает весь экран. Приостановленная деятельность не принимать пользовательский ввод и не может выполнять какой-либо код.
Stopped (остановлена)
В этом состоянии, деятельность полностью скрыта и не видна пользователю; это расценивается как работа в фоновом режиме. Во время остановки, экземпляр деятельности, и вся его информация о состоянии, такая как переменные-члены классов сохраняется, но он не может выполнять какой-либо код.

Другие состояния (Created (создана) и Started (запущена)) являются временными и система быстро переходит от них к следующему состоянию, вызвав следующий метод обратного вызова жизненного цикла. То есть, после того, как система вызывает onCreate(), она быстро вызывает onStart(), , за которым быстро следует onResume().

Вот и все основные этапы жизненного цикла деятельности. Теперь вы начнете изучать некоторое конкретное поведения жизненного цикла.

Укажите деятельность для запуска вашего приложения

Когда пользователь выбирает ваш значок приложения на главном экране, система вызывает onCreate() метод для Activity объекта в вашем приложении, который вы объявили как "главную" деятельность. Это деятельность, которая выступает в качестве основной точки входа в пользовательский интерфейс вашего приложения.

Вы можете задать, какая деятельность будет использоваться в качестве главной деятельности в Android файле манифеста, AndroidManifest.xml, который находится в корневом каталоге проекта.

Главная деятельность вашего приложения должна быть объявлена в манифесте с помощью <intent-filter> , который включает в себя MAIN действие и LAUNCHER категорию. Например:

<activity android:name=".MainActivity" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Примечание: Когда вы создаете новый Android проект с помощью инструментов Android SDK, файлы проекта по умолчанию включают Activity класс, который объявлен в манифесте, использую данный фильтром.

Если или MAIN действие или LAUNCHER категория не объявлены для одной из ваших деятельностей, то ваш значок приложения не будет появляться в списке Главного экрана приложений.

Создайте новый экземпляр

Большинство приложений включают в себя несколько различных деятельностей, которые позволяют пользователю выполнять различные действия. Является ли деятельность главной деятельностью, которая создается, когда пользователь нажимает на значок приложения, или является другой деятельностью, которую ваше приложение запускает в ответ на действие пользователя, система создает каждый раз новый экземпляр Activity вызывая его onCreate() метод.

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

Например, следующий пример onCreate() метода показывает некоторый код, который выполняет некоторые фундаментальные настройки для деятельности, такие как объявление интерфейса пользователя (определенного в XML файле макета), определение переменных-членов класса, а также настройка некоторых элементов пользовательского интерфейса.

TextView mTextView; // Member variable for text view in the layout

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set the user interface layout for this Activity
    // The layout file is defined in the project res/layout/main_activity.xml file
    setContentView(R.layout.main_activity);
    
    // Initialize member TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_message);
    
    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        // For the main activity, make sure the app icon in the action bar
        // does not behave as a button
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
    }
}

Внимание: Использование SDK_INT для предотвращения старых систем от выполнения нового API работает только на Android 2.0 (Уровень API 5) и выше. Старые версии столкнутся исключением во время выполнения.

После того, как onCreate() завершает выполнение, система вызывает onStart() и onResume() методы в быстрой последовательности. Ваша деятельность никогда не будет находиться в Created или Started состоянии. Технически, деятельность становится видна пользователю когда onStart() вызвана, но onResume() незамедлительно следует за ней, и деятельность остается в Resumed состоянии, пока что-то не произойдет, чтобы изменить это, например, при получении телефонного звонка, пользователь переходит на другую деятельность, или когда экран устройства выключается.

В следующих уроках, вы увидите, как другие методы запуска, onStart() и onResume(), полезны во время жизненного цикла вашей деятельности, когда происходит возобновление полноценной работы из Paused или Stopped состояния.

Примечание: onCreate() метод включает в себя параметр savedInstanceState , который обсуждается в последнем уроке Повторное создание деятельности.

Рисунок 2. Еще одна иллюстрация структуры жизненного цикла деятельности с акцентом на трех основных обратных вызовах, которые система вызывает последовательно при создании нового экземпляра деятельности: onCreate(), onStart(), и onResume(). Как только эта последовательность обратных вызовов завершена, деятельность достигает Resumed состояния, в котором пользователи могут взаимодействовать с деятельностью, пока они не переключаться на другую деятельность.

Уничтожьте деятельность

В то время как первым методом обратного вызова жизненного цикла деятельности является onCreate(), его самым последним обратным вызовов является onDestroy(). Система вызывает этот метод для вашей деятельности в качестве окончательного сигнала, о том что экземпляр деятельности сейчас будет полностью удален из памяти системы.

Большинству приложений не нужно реализовывать этот метод, потому что локальные ссылки на классы уничтожаются вместе с деятельностью, а ваша деятельность должна была выполнить большую часть очистки во время выполнения onPause() и onStop(). Однако, если ваша деятельность имеет фоновые потоки, которые вы создали во время onCreate() или другие долгосрочные ресурсы, которые потенциально могут привести к утечке памяти, если не будут закрыты, то вы должны остановить и освободить их во время onDestroy().

@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass
    
    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}

Примечание: Система вызывает onDestroy() после того, как уже вызван onPause() и onStop() во всех ситуациях, кроме одного: когда вы вызываете finish() внутри onCreate() метода. В некоторых случаях, например, когда ваша деятельность работает для временного принятия решения, чтобы запустить другое действие, вы могли бы назвать finish() внутри onCreate() для уничтожения деятельности. В этом случае, система немедленно вызывает onDestroy() без вызова любого другого метода жизненного цикла.