Знакомство с деятельностью, Знакомство с деятельностью

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

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

Концепция деятельности

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

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

Действие предоставляет окно, в котором приложение рисует свой пользовательский интерфейс. Обычно это окно заполняет весь экран, но может быть меньше экрана и располагаться поверх других окон. Обычно одно действие реализует один экран в приложении. Например, одно из действий приложения может реализовывать экран «Настройки» , а другое — экран «Выбор фотографии» .

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

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

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

Настройка манифеста

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

Объявить действия

Чтобы объявить свою активность, откройте файл манифеста и добавьте элемент <activity> в качестве дочернего элемента <application> . Например:

<manifest ... >
  <application ... >
      <activity android:name=".ExampleActivity" />
      ...
  </application ... >
  ...
</manifest >

Единственный обязательный атрибут для этого элемента — android:name , который определяет имя класса действия. Вы также можете добавить атрибуты, определяющие характеристики активности, такие как метка, значок или тема пользовательского интерфейса. Дополнительные сведения об этих и других атрибутах см. в справочной документации по элементу <activity> .

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

Объявить фильтры намерений

Фильтры намерений — очень мощная функция платформы Android. Они предоставляют возможность запуска активности не только по явному запросу, но и по неявному . Например, явный запрос может указать системе: «Начать действие «Отправить электронное письмо» в приложении Gmail». Напротив, неявный запрос говорит системе: «Начать экран отправки электронного письма в любом действии, которое может выполнить эту работу». Когда пользовательский интерфейс системы спрашивает пользователя, какое приложение использовать для выполнения задачи, это работает фильтр намерений.

Вы можете воспользоваться этой функцией, объявив атрибут <intent-filter> в элементе <activity> . Определение этого элемента включает элемент <action> и, необязательно, элемент <category> и/или элемент <data> . Эти элементы объединяются, чтобы указать тип намерения, на которое может реагировать ваша деятельность. Например, в следующем фрагменте кода показано, как настроить действие, которое отправляет текстовые данные и получает запросы от других действий на это:

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>

В этом примере элемент <action> указывает, что это действие отправляет данные. Объявление элемента <category> как DEFAULT позволяет активности получать запросы на запуск. Элемент <data> указывает тип данных, которые может отправлять это действие. В следующем фрагменте кода показано, как вызвать действие, описанное выше:

Котлин

val sendIntent = Intent().apply {
    action = Intent.ACTION_SEND
    type = "text/plain"
    putExtra(Intent.EXTRA_TEXT, textMessage)
}
startActivity(sendIntent)

Ява

// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.setType("text/plain");
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
// Start the activity
startActivity(sendIntent);
Если вы хотите, чтобы ваше приложение было автономным и не позволяло другим приложениям активировать его действия, вам не нужны никакие другие фильтры намерений. Действия, которые вы не хотите делать доступными для других приложений, не должны иметь фильтров намерений, и вы можете запустить их самостоятельно, используя явные намерения. Дополнительные сведения о том, как ваши действия могут реагировать на намерения, см. в разделе Намерения и фильтры намерений .

Объявить разрешения

Вы можете использовать тег <activity> манифеста, чтобы контролировать, какие приложения могут запускать определенное действие. Родительское действие не может запустить дочернее действие, если оба действия не имеют одинаковых разрешений в своем манифесте. Если вы объявляете элемент <uses-permission> для родительского действия, каждое дочернее действие должно иметь соответствующий элемент <uses-permission> .

Например, если ваше приложение хочет использовать гипотетическое приложение с именем SocialApp для публикации публикации в социальных сетях, SocialApp само должно определить разрешение, которое должно иметь приложение, вызывающее его:

<manifest>
<activity android:name="...."
   android:permission=”com.google.socialapp.permission.SHARE_POST”

/>

Затем, чтобы иметь возможность вызывать SocialApp, ваше приложение должно соответствовать разрешениям, установленным в манифесте SocialApp:

<manifest>
   <uses-permission android:name="com.google.socialapp.permission.SHARE_POST" />
</manifest>

Дополнительные сведения о разрешениях и безопасности в целом см. в разделе Безопасность и разрешения .

Управление жизненным циклом активности

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

onCreate()

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

Когда onCreate() завершается, следующим обратным вызовом всегда является onStart() .

onStart()

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

onResume()

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

Обратный вызов onPause() всегда следует за onResume() .

onPause()

Система вызывает onPause() , когда действие теряет фокус и переходит в состояние паузы. Это состояние возникает, например, когда пользователь нажимает кнопку «Назад» или «Последние». Когда система вызывает onPause() для вашего действия, технически это означает, что ваше действие все еще частично видимо, но чаще всего это указывает на то, что пользователь покидает действие, и действие вскоре перейдет в состояние «Остановлено» или «Возобновлено».

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

Не следует использовать onPause() для сохранения данных приложения или пользователя, выполнения сетевых вызовов или выполнения транзакций базы данных. Информацию о сохранении данных см. в разделе Сохранение и восстановление состояния активности .

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

onStop()

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

Следующий обратный вызов, который вызывает система, — это либо onRestart() , если действие возвращается для взаимодействия с пользователем, либо onDestroy() , если это действие полностью завершается.

onRestart()

Система вызывает этот обратный вызов, когда действие в состоянии «Остановлено» собирается возобновиться. onRestart() восстанавливает состояние активности с момента ее остановки.

За этим обратным вызовом всегда следует onStart() .

onDestroy()

Система вызывает этот обратный вызов перед уничтожением активности.

Этот обратный вызов является последним, который получает действие. onDestroy() обычно реализуется для обеспечения освобождения всех ресурсов действия при уничтожении действия или содержащего его процесса.

В этом разделе представлено только введение в эту тему. Более подробное описание жизненного цикла активности и ее обратных вызовов см. в разделе Жизненный цикл активности .