Appcompatactivity android studio что это
Перейти к содержимому

Appcompatactivity android studio что это

  • автор:

Appcompatactivity android studio что это

В прошлой теме мы рассмотрели создание простого приложения, который предлагает Android Studio по умолчанию и которое просто выводит на экран строку Hello Android.

Тестирование приложения в Android Studio

Но почему у нас выводится именно эта строка? Почему у нас вообще создается именно такой визуальный интерфейс?

Выполнение приложения Android по умолчанию начинается с класса MainActivity , который по умолчанию открыт в Android Studio:

package com.example.helloapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); >>

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

Класс MainActivity по сути представляет обычный класс java, в начале которого идет определение пакета данного класса:

package com.example.helloapp;

Далее идет импорт классов из других пакетов, функциональность которых используется в MainActivity:

import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle;

Затем идет собственно определение класса:

public class MainActivity extends AppCompatActivity

По умолчанию MainActivity наследуется от класса AppCompatActivity, который выше подключен с помощью директивы импорта. Класс AppCompatActivity по сути представляет отдельный экран (страницу) приложения или его визуальный интерфейс. И MainActivity наследует весь этот функционал.

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

protected void onCreate(Bundle savedInstanceState)

В метод setContentView() передается ресурс разметки графического интерфейса:

setContentView(R.layout.activity_main);

Именно здесь и решается, какой именно визуальный интерфейс будет иметь MainActivity. Но что в данном случае представляет ресурс R.layout.activity_main ? Это файл activity_main.xml из папки res/layout (в принципе можно заметить, что название ресурса соответствует названию файла), который также по умолчанию открыт в Android Studio:

Режим дизайнера в Android Studio

Файл activity_main.xml

Android Studio позволяет работать с визуальным интерфейсом как в режиме кода, так и в графическом режиме. Так, по умолчанию файл открыт в графическом режиме, и мы наглядно можем увидеть, как у нас примерно будет выглядеть экран приложения. И даже набрасать с панели инструментов какие-нибудь элементы управления, например, кнопки или текстовые поля.

Но также мы можем работать с файлом в режиме кода, поскольку activity_main.xml — это обычный текстовый файл с разметкой xml. Для переключения к коду нажмем на кнопку Code над графическим представлением. (Дополнительно с помощью кнопки Split можно переключиться на комбинированное представление код + графический дизайнер)

Переключене к коду layout activity_main.xml в Android Studio

Здесь мы увидим, что на уровне кода файл activity_main.xml содержит следующую разметку:

Весь интерфейс представлен элементом-контейнером androidx.constraintlayout.widget.ConstraintLayout :

ConstraintLayout позволяет расположить вложенные элементы в определенных местах экрана. Вначале элемента ConstraintLayout идет определение пространств имен XML:

xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"

Каждое пространство имен задается следующим образом: xmlns:префикс=»название_ресурса» . Например, в

xmlns:android="http://schemas.android.com/apk/res/android"

Название ресурса (или URI — Uniform Resource Indicator) — «http://schemas.android.com/apk/res/android» . И этот ресурс сопоставляется с префиксом android ( xmlns:android ).

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

  • xmlns:android=»http://schemas.android.com/apk/res/android» : содержит основные атрибуты, которые предоставляются платформой Android, применяются в элементах управления и определяют их визуальные свойства (например, размер, позиционирование)
  • xmlns:app=»http://schemas.android.com/apk/res-auto» : содержит атрибуты, которые определены в рамках приложения
  • xmlns:tools=»http://schemas.android.com/tools» : применяется для работы с режиме дизайнера в Android Studio

И чтобы упростить работу с этими ресурсами, применяются префиксы. Например, дальше мы видим:

android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">

android:layout_width определяет ширину контейнера. Этот атрибут ( layout_width ) расположен в ресурсе «http://schemas.android.com/apk/res/android». И поскольку этот ресурс сопоставляется с префиксом android , то для обращения к атрибуту перед ним через двоеточие указывается префикс данного ресурса.

Значением атрибута android:layout_width является «match_parent» . Это значит, что элемент (ConstraintLayout) будет растягиваться по всей ширине контейнера (экрана устройства).

Атрибут android:layout_height=»match_parent» определяет высоту контейнера и также определен в «http://schemas.android.com/apk/res/android». Значение «match_parent» указывает, что ConstraintLayout будет растягивается по всей длине контейнера (экрана устройства).

Атрибут tools:context определяет, какой класс activity (экрана приложения) связан с текущим определением интерфейса. В данном случае это класс MainActivity. Это позволяет использовать в Android Studio различные возможности в режиме дизайнера, которые зависят от класса activity.

TextView

Текстовое поле устанавливает текст с помощью атрибута android:text .

  • android:layout_width устанавливает ширину виджета. Значение wrap_content задает для виджета величину, достаточную для отображения в контейнере.
  • android:layout_height устанавливает высоту виджета. Значение wrap_content аналогично установке ширины задает для виджета высоту, достаточную для отображения в контейнере
  • android:text устанавливает текст, который будет выводиться в TextView (в данном случае это строка «Hello World!»)
  • app:layout_constraintLeft_toLeftOf=»parent» : указывает, что левая граница элемента будет выравниваться по левой стороне контейнера ConstraintLayout Обратите внимание, что этот атрибут определен в пространстве имен с префиксом app, то есть в «http://schemas.android.com/apk/res-auto».
  • app:layout_constraintTop_toTopOf=»parent» : указывает, что верхняя граница элемента будет выравниваться по верхней стороне контейнера ConstraintLayout
  • app:layout_constraintRight_toRightOf=»parent» : указывает, что правая граница элемента будет выравниваться по правой стороне контейнера ConstraintLayout
  • app:layout_constraintBottom_toBottomOf=»parent» : указывает, что нижняя граница элемента будет выравниваться по нижней стороне контейнера ConstraintLayout

Стоит отметить, что последние четыре атрибута вместе будут приводить к расположению TextView по центру экрана.

Таким образом, при запуске приложения сначала запускается класс MainActivity, который в качестве графического интерфейса устанавливает разметку из файла activity_main.xml. И поскольку в этой разметке прописан элемент TextView, который представляет некоторый текст, то мы и увидим его текст на экране смартфона.

Android Studio не импортирует библиотеку android.support.v7, как исправить?

Также был импортирован поддерживающий это класс:
import android.support.v7.app.AppCompatActivity;
В таком виде код прекрасно работает.
Создал аналогичный проект на другой машине — не работает. Насколько мне удалось понять, на второй машине используются более новые библиотеки androidx.
Справочник разработчиков указывает, что ранее использованная мной библиотека была заменена на androidx.appcompat.app.AppCompatActivity. Эта новая библиотека у меня импортирована, но при ней студия ругается на «implements View.OnClickListener», а установить старую библиотеку уже не удается.
Прописывал ее напрямую в Gradle:

implementation 'com.android.support:appcompat-v7:28.0.0'

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

  • Вопрос задан более трёх лет назад
  • 6843 просмотра

Activity

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

public class MainActivity extends AppCompatActivity < // содержимое класса >

Все объекты activity представляют собой объекты класса android.app.Activity , которая содержит базовую функциональность для всех activity. В приложении из прошлой темы мы напрямую с этим классом не работали, а MainActivity наследовалась от класса AppCompatActivity . Однако сам класс AppCompatActivity, хоть и не напрямую, наследуется от базового класса Activity.

Жизненный цикл приложения

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

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

После запуска activity проходит через ряд событий, которые обрабатываются системой и для обработки которых существует ряд обратных вызовов:

protected void onCreate(Bundle saveInstanceState); protected void onStart(); protected void onRestart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy();

Схематично взаимосвязь между всеми этими обратными вызовами можно представить следующим образом

Жизненный цикл приложения Android

onCreate()

onCreate — первый метод, с которого начинается выполнение activity. В этом методе activity переходит в состояние Created. Этот метод обязательно должен быть определен в классе activity. В нем производится первоначальная настройка activity. В частности, создаются объекты визуального интерфейса. Этот метод получает объект Bundle , который содержит прежнее состояние activity, если оно было сохранено. Если activity заново создается, то данный объект имеет значение null. Если же activity уже ранее была создана, но находилась в приостановленном состоянии, то bundle содержит связанную с activity информацию.

После того, как метод onCreate() завершил выполнение, activity переходит в состояние Started , и и система вызывает метод onStart()

onStart

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

onResume

При вызове метода onResume activity переходит в состояние Resumed и отображается на экране устройства, и пользователь может с ней взаимодействовать. И собственно activity остается в этом состоянии, пока она не потеряет фокус, например, вследствии переключения на другую activity или просто из-за выключения экрана устройства.

onPause

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

Но надо учитывать, что в этот состоянии activity по прежнему остается видимой на экране, и на работу данного метода отводится очень мало времени, поэтому не стоит здесь сохранять какие-то данные, особенно если при этом требуется обращение к сети, например, отправка данных по интернету, или обращение к базе данных — подобные действия лучше выполнять в методе onStop() .

После выполнения этого метода activity становится невидимой, не отображается на экране, но она все еще активна. И если пользователь решит вернуться к этой activity, то система вызовет снова метод onResume , и activity снова появится на экране.

Другой вариант работы может возникнуть, если вдруг система видит, что для работы активных приложений необходимо больше памяти. И система может сама завершить полностью работу activity, которая невидима и находится в фоне. Либо пользователь может нажать на кнопку Back (Назад). В этом случае у activity вызывается метод onStop .

onStop

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

При этом во время состояния Stopped activity остается в памяти устройства, сохраняется состояние всех элементов интерфейса. К примеру, если в текстовое поле EditText был введен какой-то текст, то после возобновления работы activity и перехода ее в состояние Resumed мы вновь увидим в текстовом поле ранее введенный текст.

Если после вызова метода onStop пользователь решит вернуться к прежней activity, тогда система вызовет метод onRestart . Если же activity вовсе завершила свою работу, например, из-за закрытия приложения, то вызывается метод onDestroy() .

onDestroy

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

Также следует отметить, что при изменении ориентации экрана система завершает activity и затем создает ее заново, вызывая метод onCreate .

В целом переход между состояниями activity можно выразить следующей схемой:

Состояния Activity в Android

Расмотрим несколько ситуаций. Если мы работаем с Activity и затем переключаемся на другое приложение, либо нажимаем на кнопку Home, то у Activity вызывается следующая цепочка методов: onPause -> onStop . Activity оказывается в состоянии Stopped. Если пользователь решит вернуться к Activity, то вызывается следующая цепочка методов: onRestart -> onStart -> onResume .

Другая ситуация, если пользователь нажимает на кнопку Back (Назад), то вызывается следующая цепочка onPause -> onStop -> onDestroy . В результате Activity уничтожается. Если мы вдруг захотим вернуться к Activity через диспетчер задач или заново открыв приложение, то activity будет заново пересоздаваться через методы onCreate -> onStart -> onResume

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

Мы можем управлять этими событиями жизненного цикла, переопределив соответствующие методы. Для этого возьмем из прошлой главы класс MainActivity и изменим его следующим образом:

package com.example.viewapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity < private final static String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG, "onCreate"); >@Override protected void onDestroy() < super.onDestroy(); Log.d(TAG, "onDestroy"); >@Override protected void onStop() < super.onStop(); Log.d(TAG, "onStop"); >@Override protected void onStart() < super.onStart(); Log.d(TAG, "onStart"); >@Override protected void onPause() < super.onPause(); Log.d(TAG, "onPause"); >@Override protected void onResume() < super.onResume(); Log.d(TAG, "onResume"); >@Override protected void onRestart() < super.onRestart(); Log.d(TAG, "onRestart"); >>

Для логгирования событий здесь используется класс android.util.Log .

В данном случае обрабатываются все ключевые методы жизненного цикла. Вся обработка сведена к вызову метода Log.d() , в который передается TAG — случайное строковое значение и строка, которая выводится в консоли Logcat в нижней части Android Studio, выполняя роль отладочной информации. Если эта консоль по умолчанию скрыта, то мы можем перейти к ней через пункт меню View -> Tool Windows -> Logcat .

И при запуске приложения мы сможем увидеть в окне Logcat отладочную информацию, которая определяется в методах жизненного цикла activity:

Необходимо ли использовать AppCompatActivity

Для чего Android Studio по умолчанию генерирует AppCompatActivity , когда я создаю любую активность через окно создания активностей? На сколько я понимаю, AppCompatActivity используется для того, чтобы внедрить новые «плюшки» андроида в старые версии (будь то фрагменты в версии ниже 3-тей или материальный дизайн ниже 5-ой) и ToolBar (если я правильно понял, это тот же ActionBar ). Может есть еще какая-то задумка в генерации, даже если я ничего такого не использую, неспроста же она?

  • android
  • android-app-compat-activity

Отслеживать
36.8k 6 6 золотых знаков 47 47 серебряных знаков 123 123 бронзовых знака
задан 22 мар 2016 в 17:56
user189127 user189127

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

AppCompatActivity применяется для обратной совместимости в плане дизайна. Также ActionbarActivity с API 21 deprecated , чем подталкивают на использование AppCompatActivity . Плюс некоторые изменения «под капотом», как то использование Toolbar и пр.

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

Отслеживать
ответ дан 22 мар 2016 в 18:41
15.8k 1 1 золотой знак 18 18 серебряных знаков 35 35 бронзовых знаков

Если вам не нужны все те возможности, которые представлены библиотекой поддержки AppCompat (а их не так уж и много: Toolbar , виджеты в стиле Material Design и темы Material Design, в основном) вы можете не использовать AppCompatActivity .

При этом вы можете использовать другие библиотеки поддержки из секции v7, вроде RecyclerView , CardView , GridLayout , Pallete и пр., так как они подключаются отдельно.

Так же вы можете использовать фрагменты в версиях ниже API 10, так как они входят в библиотеку поддержки v4 Support, AppCompat просто включает в себя зависимость к этой библиотеке, поэтому подключив первую не требуется отдельно подключать вторую.

Виджет Toolbar это очень далеко не тот же ActionBar , сходство только в назначении — инструмент намного гибче и «приятнее» в использовании (с точки зрения разработчика)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *