Activity (Активность, Деятельность)
Что такое Activity
Термин Activity еще не устоялся в русском языке у разработчиков. Некоторые используют слово Активность, другие — Деятельность. Чтобы не путаться в названиях, я буду использовать термин Активность (смотри примечание).
Разработчики со стажем могут воспринимать Активность как форму. Простые приложения состоят из одной активности. Более сложные приложения могут иметь несколько окон, т.е. они состоят из нескольких активностей, которыми надо уметь управлять и которые могут взаимодействовать между собой.
Активность, которая запускается первой, считается главной. Из нее можно запустить другую активность. Причем не только ту, которая относится к нашему приложению, но и другого приложения. Пользователю будет казаться, что все запускаемые им активности являются частями одного приложения, хотя на самом деле они могут быть определены в разных приложениях и работают в разных процессах. Попробуйте воспринимать активности как страницы разных сайтов, открываемых в браузерах по ссылке.
Обычно активность занимает весь экран устройства, но это не является обязательным требованием. Вы можете создавать полупрозрачные и плавающие окна активностей. И с развитием Android такой подход набирает обороты.
Чтобы создать активность, нужно унаследоваться от класса Activity и вызвать метод onCreate(). В результате мы получим пустой экран. Толку от такого экрана никакого. Поэтому в активность добавляют компоненты, фрагменты с помощью разметки.
Жизненный цикл активности
Активность имеет жизненный цикл — начало, когда Android создает экземпляр активности, промежуточное состояние, и конец, когда экземпляр уничтожается системой и освобождает ресурсы. Активность может находиться в трех состояниях:
- активная (active или running) — активность находится на переднем плане экрана. Пользователь может взаимодействовать с активным окном;
- приостановленная (paused) — активность потеряла фокус, но все еще видима пользователю. То есть активность находится сверху и частично перекрывает данную активность. Приостановленная активность может быть уничтожена системой в критических ситуациях при нехватке памяти;
- остановленная (stopped) — если данная активность полностью закрыта другой активностью. Она больше не видима пользователю и может быть уничтожена системой, если память необходима для более важного процесса.
Если активность, которая была уничтожена системой, нужно снова показать на экране, она должна быть полностью перезапущена и восстановлена в своем предыдущем состоянии.
Активность в виде диалогового окна
Помните, изучая темы, мы создали вторую активность в виде диалогового окна. С таким же успехом вы можете создать окно и для основной активности. Добавим в манифесте для активности строчку:
Напишем код для запуска:
Обратите внимание, что в данном примере мы не используем разметку, а программно создаём экземпляр класса TextView с необходимыми свойствами (текст, отступы) и передаём его в метод setContentView().
Програмнное создание активности
В основном мы пользуемся XML-разметкой для формирования внешнего вида активности. Это рекомендованный способ и в 99% вы будете использовать именно его. Но в некоторых случаях возможно вам понадобится создать активность программно. Сложного там ничего нет, для общего развития пригодится.
Если в стандартном случае мы подключаем XML-файл в методе setContentView(R.layout.activity_main), то при программном создании данный метод нам не понадобится. Удаляем его и пишем код:
Принцип формирования следующий — создаем объект LinearLayout (или другой контейнер) и настраиваем необходимые свойства. Далее создаём необходимые дочерние элементы и также настраиваем их свойства. Не забываем подключить дочерний элемент к родительскому через метод addView().
В данном примере мы также присваиваем компонентам идентификаторы через метод setId(), хотя необходимости в этом не было. В примере эта возможность показана для демонстрации. Если вы используете идентификаторы, то в файле res/values/stings.xml добавьте строчки:
Обычно опытные программисты создают отдельный файл для идентификаторов, например, res/values/ids.xml.
Классы Activity в Android
Android SDK включает набор классов, наследованных от Activity. Они предназначены для упрощения работы с виджетами, которые часто встречаются в обычном пользовательском интерфейсе. Перечислим некоторые из них (наиболее полезные).
- MapActivity. Инкапсулирует обработку ресурсов, необходимых для поддержки элемента MapView внутри Активности.
- ListActivity. Обертка для класса Activity, главная особенность которой — виджет ListView, привязанный к источнику данных, и обработчики, срабатывающие при выборе элемента из списка.
- ExpandableListActivity. То же самое, что и ListActivity, но вместо ListView поддерживает ExpandableListView.
- TabActivity. Позволяет разместить несколько Активностей или Представлений в рамках одного экрана, используя вкладки для переключения между элементами.
Источник
Полный список
В этом уроке мы:
— создадим и вызовем второе Activity в приложении
Урок был обновлен 12.06.2017
Мы подобрались к очень интересной теме. На всех предыдущих уроках мы создавали приложения, которые содержали только один экран (Activity). Но если вы пользуетесь смартфоном с Android, то вы замечали, что экранов в приложении обычно больше. Если рассмотреть, например, почтовое приложение, то в нем есть следующие экраны: список аккаунтов, список писем, просмотр письма, создание письма, настройки и т.д. Пришла и нам пора научиться создавать многоэкранные приложения.
Application/Library name: TwoActivity
Module name: p0211twoactivity
Package name: ru.startandroid.p0211twoactivity
Откроем activity_main.xml и создадим такой экран:
На экране одна кнопка, по нажатию которой будем вызывать второй экран.
Открываем MainActivity.java и пишем код:
Мы определили кнопку btnActTwo и присвоили ей Activity в качестве обработчика. Реализация метода onClick для кнопки пока заполнена частично — определяем, какая кнопка была нажата. Чуть позже здесь мы будем вызывать второй экран. Но сначала этот второй экран надо создать.
Если помните, при создании проекта у нас по умолчанию создается Activity.
От нас требуется только указать имя этого Activity – обычно мы пишем здесь MainActivity. Давайте разбираться, что при этом происходит.
Мы уже знаем, что создается одноименный класс MainActivity.java – который отвечает за поведение Activity. Но, кроме этого, Activity «регистрируется» в системе с помощью манифест-файла — AndroidManifest.xml.
Давайте откроем этот файл:
Нас интересует тег application. В нем мы видим тег activity с атрибутом name = MainActivity. В activity находится тег intent-filter с определенными параметрами. Пока мы не знаем что это и зачем, сейчас нам это не нужно. Забегая вперед, скажу, что android.intent.action.MAIN показывает системе, что Activity является основной и будет первой отображаться при запуске приложения. А android.intent.category.LAUNCHER означает, что приложение будет отображено в общем списке приложений Android.
Т.е. этот манифест-файл — это что-то типа конфигурации. В нем мы можем указать различные параметры отображения и запуска Activity или целого приложения. Если в этом файле не будет информации об Activity, которое вы хотите запустить в приложении, то вы получите ошибку.
Android Studio при создании модуля создала MainActivity и поместила в манифест данные о нем. Если мы надумаем сами создать новое Activity, то студия также предоставит нам визард, который автоматически добавит создаваемое Activity в манифест.
Давайте создадим новое Activity
Жмем правой кнопкой на package ru.startandroid.p0211twoactivity в папке проекта и выбираем New -> Activity -> Empty Activity
В появившемся окне вводим имя класса – ActivityTwo, и layout – activity_two.
Класс ActivityTwo создан.
В setContentView сразу указан layout-файл activty_two.
Он был создан визардом
Откройте activty_two.xml и заполните следующим кодом:
Экран будет отображать TextView с текстом «This is Activity Two».
Сохраните все. Класс ActivityTwo готов, при отображении он выведет на экран то, что мы настроили в layout-файле two.xml.
Давайте снова заглянем в файл манифеста
Появился тег activity с атрибутом name = .ActivityTwo. Этот тег совершенно пустой, без каких либо параметров и настроек. Но даже пустой, он необходим здесь.
Нам осталось вернуться в MainActivity.java и довершить реализацию метода onClick (нажатие кнопки), а именно — прописать вызов ActivityTwo. Открываем MainActivity.java и добавляем строки:
(добавляете только строки 2 и 3)
Обновите импорт, сохраните все и можем всю эту конструкцию запускать. При запуске появляется MainActivity
Нажимаем на кнопку и переходим на ActivityTwo
Код вызова Activity пока не объясняю и теорией не гружу, урок и так получился сложным. Получилось много текста и скриншотов, но на самом деле процедура минутная. Поначалу, возможно, будет непонятно, но постепенно втянемся. Создадим штук 5-6 новых Activity в разных проектах и тема уляжется в голове.
Пока попробуйте несколько раз пройти мысленно эту цепочку действий и усвоить, что для создания Activity необходимо создать класс (который наследует android.app.Activity) и создать соответствующую запись в манифест-файле.
На следующем уроке:
— разбираемся в коде урока 21
— теория по Intent и Intent Filter (не пропустите, тема очень важная)
— немного о Context
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Источник
Запуск еще одной activity в android app
После завершение предыдущего урока у Вас уже есть приложение, которое отображает поле для ввода и кнопку. В этом уроке мы добавим некоторые код в главную активность и будем запускать новую активность, когда пользователь нажимает на кнопку.
Чтобы добавить действие при нажатии на кнопку, необходимо для нее указать обработчик события. Обработчик события – это метод, который будет срабатывать при нажатии на кнопку. Есть несколько способов сделать это. Один из них – это указать в xml разметке свойство android:onClick для кнопки. В результате код для кнопки будет следующим:
Android onClick – обработчик события нажатия на кнопку
Значение свойства android:onClick равное «sendMessage» , говорит о том, что при нажатии на кнопку будет срабатывать метод sendMessage в активности, соответствующей экрану. Нам необходимо в классе главной активности ( MainActivity ) добавить соответствующий метод:
Обработчик события при нажатии на пноку
Метод обязательно должен публичным ( public ), возвращать void , принимать объект типа View и чтобы его (тип данных View ) можно было использовать, необходимо добавить импорт: «import android.view.View;» в активность. Можно оптимизировать импорты (добавить необходимые и удалить ненужные), нажав в eclipse следующую комбинацию клавиш: CTRL + SHIFT + O. Или строка с импортом добавляется автоматически, если при написании типа данных вы используете CTRL + SPACE (пробел).
Отображение всплывающей подсказки при нажатии на кнопку
Чтобы убедиться, что обработчик события срабатывает корректно, добавим в метод sendMessage следующий код:
Отображение всплывающей подсказки при нажатии на кнопку в android
Так же необходимо добавить импорт «import android.widget.Toast;» . Дальше я не буду упоминать о необходимости добавлять импорт. Если какой либо тип данных будет подчеркнут красным с ошибкой ” XXX cannot be resolved to a variable”, вероятно Вам необходимо оптимизировать импорты.
В данном обработчике событий я захардкодил строку (указал ее в коде), что нехорошо. Все строки должны быть в отдельном файле ресурсов, я так сделал, чтобы убедиться в работоспособности кода и после этого я напишу другой код.
Думаю, Вы уже запустили приложение и убедились в его работоспособности. Если нет, не сдерживайте себя ;). При нажатии на кнопку send Вы увидите заданную строку.
Создание объекта Intent для запуска новой активности
Объект типа Intent – это объект, который позволяет связывать различные компоненты (например, две различные активности). Интент – это описание какого – то действия приложением. Он может быть использован для широкого круга задач, но в большинстве случаев его используют для запуска другой активности (задачи).
Внутри метода sendMessage(), необходимо создать объект типа Intent , чтобы запустить активность DisplayMessageActivity :
Intent intent = new Intent(this, DisplayMessageActivity.class);
Конструктор, которые используется в нашем случае имеет два входных параметра. Первый – Context (Класс Activity наследуется от класса Context, по-этому передаем текущий объект – главную активность). Второй – класс компонент приложения, которому система передаст управление. В нашем случае класс активности, которую необходимо запустить.
После написания этого кода среда разработки выдаст ошибку т.к. класс DisplayMessageActivity не создан. В скором времени мы это исправим.
Intent позволяет не только запустить активность, но и и передать даже некоторые данные в нее. Сделаем это, взяв текст введенный пользователем с поля для ввода. Для этого необходимо получить само поле ввода в коде с помощью метода findViewById():
Создание intent и запуск новой активности с параметром
В Intent можно поместить множество данных различных типов. Денные хранятся как пара ключ-значение, называемые “extras”. Метод putExtra() принимает два параметра, первый – это ключ, второй – значение.
Чтобы в следующей активности получить данные, необходимо определить ключ как публичную константу (Чтоб доступ к ней был и с отправляющей и принимающей активности). Добавим определение константы EXTRA_MESSAGE в начало класса текущей активности.
Правильно определять публичные константы для передачи параметров в другие активности и хорошей практикой является именование их с использованием именования пакетов приложения. Это позволяет создавать уникальные ключи, что важно, особенно в случае, если Ваше приложение взаимодействует с другими.
Запуск активности
Чтобы запустить другую активность, необходимо вызвать метод startActivity() и передать в него объект типа Intent . Система перехватит этот вызов и запустит активность, указанную в интенте. В результате метод обработки sendMessage() будет следующим:
Android – запуск еще одной активности
Создание второй активности
Для создания новой активити необходимо при нажатии правой кнопкой мыши на проекте/пакете, в котором Вы хотите ее создать выбрать New -> Other. В разделе Android выбираем Android activity и нажимаем “Next”. Далее выбираем BlankActivity и снова “Next”.
Заполним информацию о создаваемой активности. Выбираем проект, вводим имя активити (Activity Name: DisplayMessageActivity), имя файла разметки (Layout Name: activity_display_message), заголовок (Title: My Message), Navigation Type: none (оставляем по-умолчанию ). Hierarchial Parent заполнять нет необходимости, нажимаем “Finish“.
Создание новой activity в android приложении
Если Вы используете другую среду разработки, возможно Вам придется руками создать новый класс (в том же пакете, что и главная активность), и реализовать в нем метод onCreate(). Открыв созданный еклипсой класс, Вы увидите что этот метод уже есть, так же, как и onCreateOptionsMenu(), но сейчас он нам не понадобиться (метод для создания меню мы будем использовать позже), по – этому можно его удалить. В результате активность имеет следующий вид:
Метод onCreate() новой activity
Все Activity должны содержать метод onCreate(). Он вызывается при создании активности, в нем необходимо определить разметку экрана (используя метод setContentView()) и инициализировать все необходимые компоненты.
Если Вы используете другую среду, у вас нет разметки activity_display_message.xml, которая передается в метод setContentView созданной активности. Это нестрашно т.к. мы изменим метод и она нам не понадобиться.
Используя еклипс, она сделала все необходимое для созданий новой активности, разберемся что же она натворила и сделаем это руками, если вы используете другую среду разработки.
Добавление новой строки в ресурсы
Необходимо добавить строку – заголовок для новой активности. Используя еклипс, можете убедиться что она появилась автоматически. В файле строк должно быть новое значение:
Добавление activity в AndroidManifest.xml
В манифесте должны быть задекларированы все активити запускаемые приложением. В результате манифест должен иметь следующий вид:
Обновленный файл AndroidManifest.xml
Если Вы используете еклипс, можете запустить приложение. При нажатии на кнопку отправить запуститься новая активность с надписью “Hello world!”. Если Вы используете другую среду, не переживайте что приложение до сих пор не компилируется, сейчас все поправим ;).
Прием данных с помощью Intent
В метод onCreate новой активити необходимо добавить следующий код, который получает данные из интента:
Отображение сообщения
Чтобы отобразить сообщение, необходимо создать TextView и используя метод setText() сказать ему какой текст нужно отображать. Далее (в коде! не используя файл разметки) созданный TextView установим как корневой элемент экрана активности. В итоге метод onCreate() получиться вот таким вот:
Получение данных из Intent и их отображение
Собственно, вот и все! Если Вы следовали описанным действиям, приложение должно работать корректно.
Источник