5.80M
Категория: ПрограммированиеПрограммирование

Общие сведения о Java

1.

Общие сведения о Java
Лекция 1
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

2.

Программная платформа Java
Программная платформа Java — ряд программных продуктов и спецификаций
компании Sun Microsystems, ранее независимой, а ныне дочерней компании корпорации Oracle,
которые совместно предоставляют систему для разработки прикладного программного
обеспечения и встраивания её в любое кросс-платформенное программное обеспечение.
Java используется в самых разных компьютерных платформах от встраиваемых
устройств и мобильных телефонов в нижнем ценовом сегменте, до корпоративных серверов и
суперкомпьютеров в высшем ценовом сегменте.
Java сегодня является одним из самых распространенных зыков программирования.
Первая версия языка появилась еще в 1996 году, а текущей версией является Java 12, которая
вышла в марте 2019 года.
Основной особенностью Java является то, что его код сначала транслируется в
специальный байт-код, который выполняется виртуальной машиной JVM (Java Virtual Machine)
на любой платформе. Это обеспечивает кроссплатформенность и аппаратную переносимость
программ на Java, т.е. возможность их выполнения без перекомпиляции на различных
платформах - Windows, Linux, Mac OS, и других, для которых существует своя реализация
виртуальной машины.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

3.

Программная платформа Java
Концептуальная схема платформы Java
https://docs.oracle.com/javase/8/docs/
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

4.

Программная платформа Java (ч.2)
Java™ Programming Language - это универсальный, строго типизированный
объектно-ориентированный язык на основе классов. Обычно он компилируется в
набор инструкций байт-кода и двоичный формат, определенный в спецификации
виртуальной машины Java.
JDK (Java Development Kit) – платформа для разработки. Содержит в себе JRE и
доступна по ссылке http://www.oracle.com/technetwork/java/javase/downloads/index.html
JRE (Java Runtime Environment) – исполнительная среда Java, которая
представляет собой минимальную реализацию виртуальной машины, а также
библиотеку классов.
JVM (Java Virtual Machine) - виртуальная машина Java. Для платформ,
ориентированных на использование клиентских приложений, используется Java
HotSpot Client VM, но при этом во всех платформах JDK присутствует Java HotSpot
Server VM ( серверная виртуальная машина ), обеспечивающая максимальную
скорость выполнения программы. Может быть вызвана с помощью параметра –server
командной строки при запуске приложения.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

5.

Преимущества платформы Java
• Переносимость, или кроссплатформенность ;
• Объектная ориентированность, создана эффективная
объектная модель;
• Привычный синтаксис С/С++;
• Встроенная и прозрачная модель безопасности ;
• Ориентация на Internet-задачи, сетевые распределенные
приложения;
• Динамичность, легкость развития и добавления новых
возможностей;
• Развитая экосистема
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

6.

Установка Java
Если на компьютере планируется только исполнение программ Java,
достаточно установить JRE. Для каждой конкретной платформы имеется своя
версия JRE.
Для разработки Java программ необходима установка комплекта для
разработки - JDK (Java Development Kit), который содержит в себе JRE и
доступен по ссылке:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

7.

Установка Java (ч.2)
Типы платформ JDK
Платформа Java SE предназначена для разработки приложений
для настольных компьютеров и серверов.
Java EE – разработка корпоративного ПО (в 2017-м проект Java
EE был передан Eclipse Foundation, после чего был переименован в
Jakarta EE. Модули Java EE удалены из Java SE, начиная с 11-й версии).
Java ME — Java Micro Edition, создана для использования в
устройствах, ограниченных по вычислительной мощности, например, в
мобильных телефонах, КПК, встроенных системах.
Java Card позволяет защищенным элементам, таким как смарткарты и другим защищенным от несанкционированного доступа чипам,
размещать приложения, использующие технологию Java.
Java TV - это технология, основанная на Java ME, которая
обеспечивает производительное, безопасное и простое в реализации
решение для разработки приложений Java, которые работают на ТВ и
телевизионных приставках.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

8.

Установка Java (ч.3)
После установки JDK в ОС Windows
следует добавить в переменную среды
окружения Path путь к исполняемым файлам
JDK (например, «c:\Program
Files\Java\jdk1.7.0_71\bin\»), а также создать
или отредактировать системную переменную
JAVA_HOME, значение которой также
хранит путь к исполняемым файлам JDK .
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

9.

IDE (Integrated Development Environment)
NetBeans — выбор профессиональных Java-разработчиков. Имеет уникальные
возможности и инструменты, позволяющие сделать программу кроссплатформенной,
а код удобочитаемым. Поддерживает не только Java, но и другие языки
программирования для десктоп- и веб-разработки.
Eclipse — одна из наиболее популярных IDE. Предоставляет впечатляющий
интуитивно понятный интерфейс и производительную среду разработки,
позволяющую комфортно разрабатывать приложения на Java. Скачать Eclipse можно
бесплатно с официального сайта. Имеет удобный интерфейс.
IntelliJ IDEA — известная IDE для Java, написанная, как ни странно, на Java.
Укомплектована уникальными инструментами и позволяет без проблем
ориентироваться в программе. Нахождение ошибок и отладка кода никогда не были
такими легкими, как с IntelliJ IDEA.
JCreator — продвинутая и самая быстрая IDE для Java, написанная на C++.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

10.

Первая программа Java
1. В любом текстовом редакторе
введите код:
2. Сохраните код в файле с
именем program.java в
каталоге Java на диске D:\.
3. В командной строке
выполните следующие
команды:
4. Если все выполнено верно,
результат выполнения команд
будет иметь следующий вид:
public class program{
public static void main (String args[]){
System.out.println("Hello, Java!");
}
}
d:
cd d:\java
javac program.java
java program
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

11.

Структура программы Java
package ru.sbs.jc;
import java.util.Date;
public class HelloDate {
public static void main(String[] args) {
HelloDate helloDate = new HelloDate();
helloDate.run();
Пакет – это библиотека классов с
уникальным именем.
Конструкция package помещает класс в
заданную библиотеку (определяет для
класса пространство имен).
Пакет в файловой системе
преобразуется в иерархию каталогов:
package ru.sbs.jc
}
public void run() {
System.out.println("Hello. This is");
System.out.println(new Date());
}
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

12.

Структура программы Java (ч.2)
package ru.sbs.jc;
import java.util.Date;
public class HelloDate {
public static void main(String[] args) {
HelloDate helloDate = new HelloDate();
helloDate.run();
}
public void run() {
System.out.println("Hello. This is");
System.out.println(new Date());
}
}
Результат
выполнения:
Конструкция import приказывает компилятору
загрузить пакет или класс, принадлежащий пакету.
Стандартные классы Java относятся к пакету,
начинающегося с ключевого слова java.
Java является объектно-ориентированным
языком, поэтому вся программа представляется в виде
набора взаимодействующих классов. В данном случае
определен один класс HelloDate. При определении
класса вначале идет модификатор доступа public,
который указывает, что данный класс будет доступен
всем, то есть мы сможем его запустить из командной
строки.
Важно!
• Каждый класс помещается в отдельный файл;
• Каждый класс принадлежит определенному
пакету или пакету по умолчанию.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

13.

Структура программы Java (ч.3)
package ru.sbs.jc;
import java.util.Date;
public class HelloDate {
public static void main(String[] args) {
HelloDate helloDate = new HelloDate();
helloDate.run();
}
public void run() {
System.out.println("Hello. This is");
System.out.println(new Date());
}
}
Класс может содержать различные
переменные и методы. В данном случае
объявлены методы main и run.
main - главный метод в любой
программе на Java, он является входной
точкой программы и с него начинается все
управление. Он обязательно должен
присутствовать в программе.
Слово static указывает, что метод
main - статический, т.е. существует на уровне
класса, а не на уровне объекта.
Слово void - что метод не возвращает
никакого значения.
Далее в скобках у указываются
параметры метода - String args[] - это массив
args, который хранит значения типа String, то
есть строки. В данном случае они не
используются.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

14.

Структура программы Java (ч.4)
package ru.sbs.jc;
import java.util.Date;
public class HelloDate {
public static void main(String[] args) {
HelloDate helloDate = new
HelloDate();
HelloDate helloDate = new HelloDate(); создание ссылки и объекта (new).
helloDate.run(); - вызов метода run,
осуществляющего вывод сообщений на консоль
при помощи встроенного метода
System.out.println(), получающего строку в
качестве аргумента.
helloDate.run();
}
public void run() {
System.out.println("Hello. This is");
System.out.println(new Date());
Результат
выполнения:
}
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

15.

Переменные и константы
Для хранения данных в программе используются переменные и константы. Т.к. язык является
строго типизированным, каждая переменная и константа представляет определенный тип и
данный тип строго определен.
Тип данных определяет диапазон значений, которые может хранить переменная или константа.
В Java существует 8 примитивных типов данных, для определения переменных, не
являющихся объектами. Это пять целочисленных типов: byte, short, int, long, а также к ним
относят символьный char. Затем два дробных типа float и double и, наконец, булевский тип
boolean.
Для переменных примитивных типов Вместо ссылки создается идентификатор,
int x; // объявление переменной
x = 10; // присвоения значения
int y = 2; // объявление и инициализация переменной
int x = 8, y = 15;
var x = 10;
final int LIMIT = 5; //объявление и инициализация
константы
не являющийся ссылкой, имеющий
определенное значение и
располагающийся в стеке.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

16.

Примитивные типы данных Java
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

17.

Разница между примитивными и ссылочными типами данных Java
Помимо вышеупомянутых восьми примитивных типов, остальные типы данных являются ссылочными и
представляют собой объекты.
Разница между переменными примитивных и ссылочных типов определяется способом их хранения.
Для оптимальной работы приложения JVM делит память на область стека (stack) и область кучи (heap).
Всякий раз при объявлении новых переменных, создании объектов или вызове метода, JVM выделяет память для
этих операций в стеке или в куче.
Стек работает по схеме LIFO (последним вошел, первым вышел). Всегда при вызове нового метода, все
переменные примитивных типов или ссылки на объекты сохраняются в блоке памяти на вершине стека.
При завершении метода блок памяти, отведенный для его нужд, очищается, и пространство становится
доступным для следующего метода. Доступ к стеку осуществляется быстрее, чем к куче и стек является
потокобезопасным, т.к. для каждого потока создается свой стек.
Куча используется для хранения классов и объектов. Объекты всегда сохраняются в куче, а ссылки на них в
стеке. Объекты имеют глобальный доступ и доступны из любого места программы. Доступ к памяти медленнее,
чем к стеку и автоматически она не освобождается (для удаления неиспользуемых объектов используется сборщик
мусора). Помимо этого, куча не является потокобезопасной и требует контроля и синхронизации кода.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

18.

Основные отличия стека и кучи
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

19.

Упаковщики примитивных типов данных Java
Для каждого простейшего типа существуют классы упаковщики (обертки), которые позволяют из
простейшего типа создать неэлементарный объект. В таких классах есть некоторые полезные
методы и константы, например минимальное значение типа int можно узнать использовав
константу Integer.MIN_VALUE. Оборачивание примитива в объект называется упаковкой
(boxing), а обратный процесс распаковкой (unboxing).
Пример использования:
int i;
Integer boxed;
// Обычное создание объекта
boxed = new Integer(i);
// Фабричный метод
boxed = Integer.valueOf(i);
// Автоматическая упаковка, компилятор просто вставит вызов
//Integer.valueOf
boxed = i;
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

20.

Преобразование примитивных типов Java
Каждый примитивный тип данных занимает определенное количество байт
памяти, что ограничивает использование различных типов в операции:
int a = 4;
byte b = a; // ! Ошибка
Явное преобразование типов:
Неявное преобразование типов:
int a = 4;
byte b = (byte)a;
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

21.

Символы и строки
В качестве значения переменная символьного типа получает одиночный символ,
заключенный в ординарные кавычки: char ch='e';. Кроме того, переменной
символьного типа также можно присвоить целочисленное значение от 0 до 65536.
В этом случае переменная опять же будет хранить символ, а целочисленное
значение будет указывать на номер символа в таблице символов Unicode
Пример использования:
char ch1=‘d’; // символ ‘d'
char ch2=102; // символ 'f'
Символьные переменные не стоит путать со строковыми, 'a' не
идентично "a". Строковые переменные представляют объект String, который в
отличие от char или int не является примитивным типов в Java:
Пример использования: String hello = "Hello...";
String s = new String(“Hello world”);
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

22.

Работа со строками
Если выражение начинается строкой, то все последующие операторы
преобразуются ко строкам:
int a = 1;
System.out.println(“Hello “ + a);
Если объект String уже создан, то изменить его значение нельзя. Любое
изменение приводит к созданию нового объекта.
Возможно лишь создать новый объект String, в котором использовать значение
String s1 = “Hello”.
исходного.
String s2 = s1 + “ world”.
Если нужно работать со строками, часто меняющими свое значение, но для
этого есть класс StringBuffer или StringBuilder.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

23.

Работа со строками (ч.2)
Основные методы класса String:
concat(): объединяет строки
valueOf(): преобразует объект в строковый вид
join(): соединяет строки с учетом разделителя
сompare(): сравнивает две строки
charAt(): возвращает символ строки по индексу
getChars(): возвращает группу символов
equals(): сравнивает строки с учетом регистра
equalsIgnoreCase(): сравнивает строки без учета регистра
regionMatches(): сравнивает подстроки в строках
indexOf(): находит индекс первого вхождения подстроки в строку
lastIndexOf(): находит индекс последнего вхождения подстроки в строку
startsWith(): определяет, начинается ли строка с подстроки
endsWith(): определяет, заканчивается ли строка на определенную подстроку
replace(): заменяет в строке одну подстроку на другую
trim(): удаляет начальные и конечные пробелы
substring(): возвращает подстроку, начиная с определенного индекса до конца или до
определенного индекса
toLowerCase(): переводит все символы строки в нижний регистр
toUpperCase(): переводит все символы строки в верхний регистр

24.

Работа со строками (ч.3)
Классы StringBuffer и StringBuilder представляют собой расширяемую строку,
которую можно изменять без ущерба для производительности.
Различие классов состоит в том, что класс StringBuffer синхронизированный и
потокобезопасный. То есть класс StringBuffer удобнее использовать в многопоточных
приложениях, где объект данного класса может меняться в различных потоках.
Класс StringBuilder не потокобезопасный, но при этом работает быстрее, чем
StringBuffer в однопоточных приложениях.
Методы StringBuffer и StringBuilder:
charAt() и setCharAt() : получает и устанавливает символ по указанному индексу;
getChars(): получает набор символов между определенными индексами;
append(): добавляет подстроку в конец StringBuffer;
insert(): добавляет строку или символ по определенному индексу в StringBuffer;
delete(): удаляет все символы с определенного индекса о определенной позиции;
substring(): обрезает строку с определенного индекса до конца, либо до определенного
индекса;
replace(): замены подстроки между определенными позициями на другую подстроку;
reverse(): меняет порядок в StringBuffer на обратный.

25.

Синтаксис
Присвоение, приведение типов
int a = 4;
char c = (char)(Math.random() * 26 +’a’);
Для объектов присваиваются только ссылки, т.е. старая ссылка начинает
указывать на новый объект.
Арифметические операции:
+ , - , / , *
% (остаток от деления нацело)
++ , -- (пре- и постинкременты/декременты)
Операторы сравнения:
true, false
==, >, <, >=, <=, !=
equals (сравнивает по ссылке, а не по значению. Следует переопределять)
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

26.

Синтаксис (ч.2)
Логические операторы:
&&, ++, !
Поразрядные операторы:
&, |, ^ (XOR), ~ (НЕ)
Операторы сдвига
<<, >>
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

27.

Синтаксис (ч.4)
Цикл for
Циклы
Цикл do
for (int i = 1; i < 9; i++){
int j = 7;
System.out.printf("Квадрат числа %d равен %d \n",
i, i * i);
do{
System.out.println(j);
}
j--;
}
while (j > 0);
Цикл while
int j = 6;
while (j > 0){
System.out.println(j);
}
j--;
Операторы continue и break
Оператор break позволяет выйти из
цикла в любой его момент, даже если
цикл не закончил свою работу.
Оператор continue осуществляет переход
к следующей итерации цикла.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

28.

Синтаксис (ч.3)
Условия:
switch
if-else
int num1 = 6;
int num = 8;
int num2 = 8;
switch(num){
if(num1>num2){
case 1:
System.out.println("Первое число больше второго");
System.out.println("число равно 1");
}
break;
else if(num1<num2){
case 8:
System.out.println("Первое число меньше второго");
System.out.println("число равно 8");
}
num++;
else{
System.out.println("Числа равны");
}
break;
default:
System.out.println("число не равно 1, 8, 9");
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

29.

Оформление программного кода
•ключевые слова записываются строчными буквами;
•имена классов записываются с прописной буквы;
•если имя состоит из нескольких слов, они объединяются, новое слово
начинается с прописной буквы;
•для методов, полей и идентификаторов используется та же система, за
исключением первой буквы – она строчная;
•имена констант записываются строчными буквами.
•скобки ставятся на тех же строчках, что и ключевые слова
class HelloWorld {
public static String OUTPUT = “Hello world”;
public void run() {
}
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

30.

Комментарии
Комментарии делятся на два типа:
•комментарии
•встроенная документация
Обычные комментарии:
/* */
//
Встроенная документация:
/** */
/** Комментарий к классу */
class A {
/** комментарий к переменной */
public int i;
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

31.

Самостоятельная работа
1. Выполнить установку и настройку JDK.
2. Используя текстовый редактор написать, откомпилировать,
запустить программы Java, приведенные на слайдах 9, 10.
3. Установить IDE Eclipse (редакция EE).
4. Написать и произвести анализ скорости работы программы
посимвольного добавления 65000 символов к строке при
использовании классов String и StringBuffer.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

32.

Java в Android
Лекция 2
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

33.

Основы создания приложений под Android
Android - бесплатная операционная система, основанная на Linux с интерфейсом
программирования Java.
Приложения для Android пишутся на языке программирования Java и Kotlin.
Инструменты Android SDK (Software Development Kit – комплект разработки программного
обеспечения) компилируют код Java и все требуемые файлы данных и ресурсов в файл APK –
программный пакет Android, который представляет собой файл архива с расширением .apk.
В файле APK находится все, что требуется для работы Android-приложения, и он позволяет
установить приложение на любом устройстве под управлением системы Android.
При разработке на Java могут использоваться различные среды разработки, такие как
Android Studio, Eclipse, IntelliJ IDEA.
Однако следует учитывать, что с 2016 официальная поддержка плагинов Eclipse под Android
прекратилась, а Android Studio объявлена Google официальной средой разработки под Android.
Android Studio, по сути —известная Java IDE IntelliJ IDEA с плагинами, ориентированными
на разработку под Android. Актуальная версия доступна для скачивания по ссылке:
https://developer.android.com/studio/index.html.
Для разработки в Android Studio необходимо установить JDK (Java Development Kit),
который является обязательным компонентом для разработки на Java и доступен по ссылке:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

34.

Функционал Android Studio
•Расширенный редактор макетов: WYSIWYG, способность работать с UI компонентами при
помощи Drag-and-Drop, функция предпросмо
тра макета на нескольких конфигурациях
экрана.
•Сборка приложений, основанная на Gradle.
•Различные виды сборок и генерация нескольких .apk файлов
•Рефакторинг кода.
•Статический анализатор кода (Lint), позволяющий находить проблемы производительности,
несовместимости версий и другое.
•Встроенный ProGuard и утилита для подписывания приложений.
•Шаблоны основных макетов и компонентов Android.
•Поддержка разработки приложений для Android Wear и Android TV[6].
•Встроенная поддержка Google Cloud Platform, которая включает в себя интеграцию с
сервисами Google Cloud Messaging и App Engine.
•Android Studio 2.1 поддерживает Android N Preview SDK, а это значит, что разработчики смогут
начать работу по созданию приложения для новой программной платформы.
•Поддержка всех инструментов языка Kotlin .
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

35.

Системные требования Android Studio
OS X
Windows
Версия OS
Linux
Microsoft Windows
Mac® OS X® 10.8.5 или
10/8/7/Vista/2003 (32 или выше, до 10.13 / 10.14
64-bit)
(High Sierra/Mojave)
GNOME или KDE
Оперативная память
3 ГБ (минимум), 8 ГБ (рекомендуется); +1 ГБ для Android Emulator
Свободное место на
диске
2 ГБ минимум (500 МБ для IDE + 1.5 ГБ для Android SDK и образа системы
эмулятора), 4 ГБ SSD рекомендуемое
Версия JDK
Java Development Kit 8
Разрешение экрана
1280 x 800 (минимум)
Дополнительно

Java Runtime
Environment (JRE) 6
GNU C Library (glibc) 2.15
или выше
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

36.

Кратко об Android
Каждое приложение Android, установленное на устройстве, работает в
собственной "песочнице" (изолированной программной среде):
операционная система Android представляет собой многопользовательскую
систему Linux, в которой каждое приложение является отдельным пользователем;
по умолчанию система назначает каждому приложению уникальный
идентификатор пользователя Linux (этот идентификатор используется только системой
и неизвестен приложению);
система устанавливает полномочия для всех файлов в приложении, с тем чтобы
доступ к ним был разрешен только пользователю с идентификатором, назначенным
этому приложению;
у каждого процесса имеется собственная виртуальная машина (ВМ), так что код
приложения выполняется изолированно от других приложений;
по умолчанию каждое приложение выполняется в собственном процессе Linux.
Android запускает процесс, когда требуется выполнить какой-либо компонент
приложения, а затем завершает процесс, когда он больше не нужен либо, когда системе
требуется освободить память для других приложений.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

37.

Кратко об Android (ч.2)
Система Android реализует принцип предоставления минимальных прав. То есть
каждое приложение по умолчанию имеет доступ только к тем компонентам, которые ему
необходимы для работы, и ни к каким другим. Благодаря этому формируется
исключительно безопасная среда, в которой приложение не имеет доступа к
недозволенным областям системы.
Однако у приложения есть варианты предоставления своих данных другим
приложениям и доступа к системным службам:
двум приложениям можно назначить один идентификатор пользователя Linux. В
этом случае каждый из них сможет обращаться к файлам другого приложения. Для
экономии ресурсов системы также можно сделать так, чтобы приложения с одинаковым
идентификатором пользователя выполнялись в одном процессе Linux и использовали
одну ВМ ( приложения также должны быть подписаны одним сертификатом);
приложение может запросить разрешение на доступ к данным устройства,
например к контактам пользователя, SMS-сообщениям, подключаемой карте памяти (SDкарте), камере, Bluetooth и др. Все разрешения должны предоставляться приложению при
его установке.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

38.

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

39.

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

40.

Операции (ч.2)
Каждый раз, когда запускается новая операция, предыдущая операция
останавливается, однако система сохраняет ее в стеке («стек переходов назад»).
Стек переходов назад работает по принципу «последним вошёл — первым
вышел», поэтому после того как пользователь завершил текущую операцию и
нажал кнопку Назад, текущая операция удаляется из стека (и уничтожается), и
возобновляется предыдущая операция.
Когда операция останавливается по причине запуска новой операции, для
уведомления об изменении ее состояния используются методы обратного вызова
жизненного цикла операции.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

41.

Службы
Служба (Service) представляет собой компонент, который работает в фоновом
режиме и выполняет длительные операции, связанные с работой удаленных процессов.
Служба не имеет пользовательского интерфейса. Например, она может
воспроизводить музыку в фоновом режиме, пока пользователь работает в другом
приложении, или же она может получать данные по сети, не блокируя взаимодействие
пользователя с операцией.
Служба может быть запущена другим компонентом, который затем будут
взаимодействовать с ней, – например операцией.
Служба относится к подклассу класса Service.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

42.

Поставщики контента
Поставщик контента (Content provider) управляет общим набором
данных приложения. Данные можно хранить в файловой системе, базе данных
SQLite, в Интернете или любом другом постоянном месте хранения, к которому у
вашего приложения имеется доступ.
Посредством поставщика контента другие приложения могут
запрашивать или даже изменять данные (если поставщик контента позволяет
делать это). Например, в системе Android есть поставщик контента, который
управляет информацией контактов пользователя. Любое приложение, получившее
соответствующие разрешения, может запросить часть этого поставщика контента
(например ContactsContract.Data), для чтения и записи сведений об
определенном человеке.
Поставщик контента относится к подклассу класса ContentProvider.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

43.

Приемники широковещательных сообщений
Приемник широковещательных сообщений (Broadcast receiver) представляет
собой компонент, который реагирует на объявления распространяемые по всей системе.
Многие из этих объявлений рассылает система — например объявление о том, что экран
выключился, аккумулятор разряжен или был сделан фотоснимок. Объявления также
могут рассылаться приложениями, — например, чтобы сообщить другим приложениям о
том, что какие-то данные были загружены на устройство и теперь готовы для
использования.
Несмотря на то что приемники широковещательных сообщений не имеют
пользовательского интерфейса, они могут создавать уведомления в строке состояния,
чтобы предупредить пользователя о событии "рассылка объявления". Однако чаще всего
они являются просто "шлюзом" для других компонентов и предназначены для
выполнения минимального объема работы. Например , они могут инициировать
выполнение службой определенных действий при возникновении события.
Приемник широковещательных сообщений относится к подклассу класса
BroadcastReceiver , а каждое такое сообщение предоставляется как объект Intent.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

44.

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

45.

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

46.

Активация компонентов. Intent
Компоненты трех из четырех возможных типов — операции, службы и приемники
широковещательных сообщений — активируются асинхронным сообщением, которое
называется Intent (намерение). Объекты Intent связывают друг с другом отдельные
компоненты во время выполнения, будь то это компоненты вашего или стороннего
приложения (эти объекты Intent можно представить себе в виде мессенджеров, которые
посылают другим компонентам запрос на выполнение действий).
Объект Intent создается с помощью объекта Intent, который описывает запрос на
активацию либо конкретного компонента, либо компонента конкретного типа —
соответственно, намерение Intent может быть явным или неявным.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

47.

Активация операций и служб
Для операций и служб Объект Intent определяет действие, которое требуется
выполнить (например, просмотреть (view) или отправить (send) что-то), а также может
указывать URI (Uniform Resource Identifier – унифицированный идентификатор ресурса)
данных, с которыми это действие нужно выполнить (помимо прочих сведений, которые
нужно знать запускаемому компоненту). Например, объект Intent может передавать запрос
на выполнение операции "показать изображение" или "открыть веб-страницу".
В некоторых ситуациях операцию можно запустить, чтобы получить результат. В
этом случае операция возвращает результат также в виде объекта Intent (например, можно
отправить сообщение Intent, чтобы дать пользователю возможность выбрать контакт и
вернуть его вам — в ответном сообщении Intent будет содержаться URI, указывающий на
выбранный контакт).
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

48.

Активация широковещательных сообщений
и поставщиков контента
Для приемников широковещательных сообщений Intent просто определяет
передаваемое объявление (например, широковещательное сообщение о низком уровне
заряда аккумулятора содержит только строку "аккумулятор разряжен").
Компоненты четвертого типа – поставщики контента – сообщениями Intent не
активируются. Они активируются по запросу от ContentResolver. Процедура определения
контента (content resolver) обрабатывает все прямые транзакции с поставщиком контента,
с тем чтобы этого не пришлось делать компоненту, который выполняет транзакции с
поставщиком. Вместо этого он вызывает методы для объекта ContentResolver. Это
формирует слой, абстрагирующий (в целях безопасности) поставщика контента от
компонента, запрашивающего информацию.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

49.

Методы активации компонентов
Для активации компонентов каждого типа имеются отдельные методы:
Можно запустить операцию (или определить для нее какое-то новое действие),
передав объект Intent методу startActivity() или startActivityForResult() (если требуется,
чтобы операция вернула результат).
Можно запустить службу (либо выдать работающей службе новые инструкции),
передав объект Intent методу startService(). Либо можно установить привязку к службе,
передав объектIntent методу bindService().
Можно инициировать рассылку сообщений, передав объект Intent таким методам,
как sendBroadcast(), sendOrderedBroadcast() и sendStickyBroadcast().
Можно выполнить запрос к поставщику контента, вызвав метод query() для
объекта ContentResolver.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

50.

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

51.

Жизненный цикл операции 2
Все объекты activity представляют
собой объекты класса android.app.Activity,
который содержит базовую
функциональность для всех activity.
После запуска activity проходит
через ряд событий, которые
обрабатываются системой и для обработки
которых существует ряд обратных вызовов:
protected void onCreate(Bundle saveInstanceState);
protected void onStart();
protected void onRestoreInstanceState(Bundle
saveInstanceState);
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onSaveInstanceState(Bundle
saveInstanceState);
protected void onStop();
protected void onDestroy();

52.

Методы операции
onCreate()
onCreate - первый метод, с которого начинается выполнение activity. В этом методе
activity переходит в состояние Created. Этот метод обязательно должен быть
определен в классе activity. В нем производится первоначальная настройка activity.
В частности, создаются объекты визуального интерфейса. Этот метод получает
объект Bundle, который содержит прежнее состояние activity, если оно было
сохранено. Если activity заново создается, то данный объект имеет значение null.
Если же activity уже ранее была создана, но находилась в приостановленном
состоянии, то bundle содержит связанную с activity информацию.
onStart()
В методе onStart() осуществляется подготовка к выводу activity на экран
устройства. Как правило, этот метод не требует переопределения, а всю работу
производит встроенный код. После завершения работы метода activity отображается
на экране, вызывается метод onResume, а activity переходит в состояние Resumed.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

53.

Методы операции (ч.2)
onRestoreInstanceState
После завершения метода onStart() вызывается метод
onRestoreInstanceState, который призван восстанавливать сохраненное
состояние из объекта Bundle, который передается в качестве параметра. Но
следует учитывать, что этот метод вызывается только тогда, когда Bundle не
равен null и содержит ранее сохраненное состояние. Так, при первом запуске
приложения этот объект Bundle будет иметь значение null, поэтому и метод
onRestoreInstanceState не будет вызываться.
onResume
При вызове метода onResume activity переходит в состояние Resumed, а
пользователь может с ней взаимодействовать. И собственно activity остается в
этом состоянии, пока она не потеряет фокус, например, вследствии
переключения на другую activity или просто из-за выключения экрана
устройства.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

54.

Методы операции (ч.3)
onPause
Если пользователь решит перейти к другой activity, то система вызывает метод
onPause. В этом методе можно освобождать используемые ресурсы, приостанавливать
процессы, например, воспроизведение аудио, анимаций, останавливать работу камеры (если
она используется) и т.д., чтобы они меньше сказывались на производительность системы.
Но надо учитывать, что на работу данного метода отводится очень мало времени,
поэтому не стоит здесь сохранять какие-то данные, особенно если при этом требуется
обращение к сети, например, отправка данных по интернету, или обращение к базе данных.
После выполнения этого метода activity становится невидимой, не отображается на
экране, но она все еще активна. И если пользователь решит вернуться к этой activity, то
система вызовет снова метод onResume, и activity снова появится на экране.
Другой вариант работы может возникнуть, если вдруг система видит, что для
работы активных приложений необходимо больше памяти. И система может сама
завершить полностью работу activity, которая невидима и находится в фоне. Либо
пользователь может нажать на кнопку Back (Назад). В этом случае у activity вызывается
метод onStop.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

55.

Методы операции (ч.4)
onSaveInstanceState
Метод onSaveInstanceState вызывается после метода onPause(), но до вызова
onStop(). В onSaveInstanceState производится сохранение состояния приложения в
передаваемый в качестве параметра объект Bundle.
onStop
В этом методе activity переходит в состояние Stopped. В методе onStop следует
особождать используемые ресурсы, которые не нужны пользователю, когда он не
взаимодействует с activity. Здесь также можно сохранять данные, например, в базу
данных.
При этом во время состояния Stopped activity остается в памяти устройства,
сохраняется состояние всех элементов интерфейса. К примеру, если в текстовое поле
EditText был введен какой-то текст, то после возобновления работы activity и перехода ее
в состояние Resumed мы вновь увидим в текстовом поле ранее введенный текст.
Если после вызова метода onStop пользователь решит вернуться к прежней activity, тогда
система вызовет метод onRestart. Если же activity вовсе завершила свою работу,
например, из-за закрытия приложения, то вызывается метод onDestroy().
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

56.

Методы операции (ч.5)
onDestroy
Завершается работа активности вызовом метода onDestroy, который возникает либо,
если система решит убить activity, либо при вызове метода finish().
Также следует отметить, что при изменении ориентации экрана система завершает activity
и затем создает ее заново, вызывая метод onCreate.

57.

Файл манифеста
Для запуска компонента приложения системе Android необходимо знать, что
компонент существует. Для этого она читает файл AndroidManifest.xml приложения (файл
манифеста). В этом файле, который должен находиться в корневой папке приложения,
должны быть объявлены все компоненты приложения, а также он содержит:
указание всех полномочий пользователя, которые требуются приложению,
например разрешения на доступ в Интернет или на чтение контактов пользователя;
объявление минимальногоуровня API, требуемого приложению, с учетом того,
какие API-интерфейсы оно использует;
объявление аппаратных и программных функций, которые нужны приложению
или используются им, например камеры, службы Bluetooth или сенсорного экрана;
указание библиотек API, с которыми необходимо связать приложение (отличные
от API-интерфейсов платформы Android), например библиотеки Google Maps;
и т.д.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

58.

Графический интерфейс
пользователя
Лекция 3
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

59.

GUI Android
Графический интерфейс
пользователя в Android представляет
собой иерархию объектов
android.view.View и
android.view.ViewGroup.
Каждый объект ViewGroup
представляет контейнер, который
содержит и упорядочивает дочерние
объекты View. В частности, к
контейнерам относят такие элементы,
как LinearLayout, GridLayout,
ConstraintLayout и ряд других.
Простые объекты View представляют
собой элементы управления и прочие
виджеты, например, кнопки, текстовые
поля и т.д., через которые пользователь
взаимодействует с программой.
Большинство визуальных элементов, наследующихся от класса
View, такие как кнопки, текстовые поля и другие, располагаются
в пакете android.widget
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

60.

MainActivity
Ключевым компонентом
для создания визуального
интерфейса в приложении
Android является activity
(активность). Нередко activity
ассоциируется с отдельным
экраном или окном
приложения, а переключение
между окнами будет
происходить как
перемещение от одной activity
к другой.
Создание приложения
начинается с выбора шаблона
главной activity.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

61.

Основные файлы проекта
После конфигурирования проекта
на экране Android Studio
отображаются два файла,
определяющих пользовательский
интерфейс:
- файл класс MainActivity.java
- файл разметки интерфейса
activity_main.xml.
Разметку интерфейса (визуальные
элементы) можно создавать как
программно, в коде java, так и в файле
XML, однако второй способ
предпочтительнее, так как позволяет
разграничить интерфейс и логику
приложения.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

62.

Взаимосвязь MainActivity.java и activity_main.xml
activity_main.xml
В файле xml определяются все графические элементы
и их атрибуты, которые составляют интерфейс.
Файл разметки должен содержать один корневой
элемент. В данном случае корневым элементом
является элемент ConstraintLayout.
MainActivity.java
При компиляции XML-файл разметки
компилируется в ресурс View. Загрузка
ресурса разметки (layout) осуществляется в
методе Activity.onCreate c помощью метода
setContentView().
Для получения ссылки на ресурс в коде java
необходимо использовать выражение
R.layout.[название_ресурса].
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

63.

Взаимосвязь MainActivity.java и activity_main.xml
activity_main.xml
В файле xml определяются все графические элементы
и их атрибуты, которые составляют интерфейс.
Файл разметки должен содержать один корневой
элемент. В данном случае корневым элементом
является элемент ConstraintLayout.
MainActivity.java
При компиляции XML-файл разметки
компилируется в ресурс View. Загрузка
ресурса разметки (layout) осуществляется в
методе Activity.onCreate c помощью метода
setContentView().
Для получения ссылки на ресурс в коде java
необходимо использовать выражение
R.layout.[название_ресурса].
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

64.

Использование нескольких файлов layout для одной Activity
Одна Activity может использовать несколько файлов разметки. Для добавления нового
файла разметки необходимо выбрать:File-New-Layout XML file, и выполнить конфигурирование
разметки.
Для смены отображаемого файла
размети следует воспользоваться
методом
setContentView(R.layout.activity_main);
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

65.

Средства разработки GUI Android Studio
Манипуляции с визуальными компонентами Activity_main.xml удобно выполнять в режиме
дизайнера
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

66.

Свойства компонентов
При добавлении компонента следует определить
информативный id, т.к. id – основной атрибут для
доступа к компонентам.
Изменение атрибут в режиме дизайнера сразу
синхронизируется с текстом activity_main.xml.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

67.

Предпросмотр в текстовом режиме
При работе с activity_main.xml в текстовом режиме удобно пользоваться режимом предпросмотра
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

68.

Определение размеров
В Android используются следующие типы измерений:
px: пиксели текущего экрана. Эта единица измерения не рекомендуется, так как
реальное представление внешнего вида может изменяться в зависимости от устройства.
dp: (device-independent pixels) независимые от плотности экрана пиксели.
Абстрактная единица измерения, основанная на физической плотности экрана с
разрешением 160 dpi (точек на дюйм). В этом случае 1dp = 1px. Если размер экрана
больше или меньше, чем 160dpi, количество пикселей, которые применяются для
отрисовки 1dp соответственно увеличивается или уменьшается.
sp: (scale-independent pixels) независимые от масштабирования пиксели. Допускают
настройку размеров, производимую пользователем. Рекомендуются для работы со
шрифтами.
pt: 1/72 дюйма, базируются на физических размерах экрана
mm: миллиметры
in: дюймы
Предпочтительными единицами для использования являются dp.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

69.

Определение размеров ч.2
Квадрат размером 300px на 300px на
экранах Nexus 4, Nexus 5X и Nexus
В одном случае квадрат по ширине
занимает 40%, в другом - треть ширины, в
третьем - 20%.
Квадрат размером 300dp на 300dp на
экранах Nexus 4, Nexus 5X и Nexus
Размеры квадрата на разных устройствах
выглядят более консистентно
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

70.

Определение размеров ч.3
Для упрощения работы с размерами все размеры разбиты на несколько групп:
ldpi (low): ~120dpi
mdpi (medium): ~160dpi
hdpi (high): ~240dpi (к данной группе можно отнести такое устройство как Nexus
One)
xhdpi (extra-high): ~320dpi (Nexus 4)
xxhdpi (extra-extra-high): ~480dpi (Nexus 5/5X, Samsung Galaxy S5)
xxxhdpi (extra-extra-extra-high): ~640dpi (Nexus 6/6P, Samsung Galaxy S6)
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

71.

Ширина и высота компонентов
Все визуальные компоненты, как правило, упорядочиваются на экране с
помощью контейнеров LinearLayout, GridLayout, TableLayout, ConstraintLayout,
FrameLayout, RelativeLayout.
Все они по разному располагают компоненты и управляют ими, но есть
некоторые общие моменты при компоновке визуальных компонентов.
Для организации компоненты внутри контейнера используются параметры
разметки. Для их задания в файле xml используются атрибуты, которые начинаются с
префикса layout_.
к таким параметрам относятся атрибуты layout_height и layout_width, которые
используются для установки размеров и могут принимать одно из следующих
значений:
точные размеры элемента, например 96 dp
значение wrap_content: элемент растягивается до тех границ, которые
достаточны, чтобы вместить все его содержимое;
значение match_parent: элемент заполняет всю область родительского
контейнера (тот же эффект будет при установке значения 0dp ).
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

72.

Внутренние и внешние отступы
Параметры разметки позволяют задать отступы как от внешних границ
элемента до границ контейнера, так и внутри самого элемента между его
границами и содержимым.
Внутренние отступы Padding
Для установки внутренних отступов применяется атрибут
android:padding. Он устанавливает отступы контента от всех четырех сторон
контейнера. Можно устанавливать отступы только от одной стороны
контейнера, применяя следующие атрибуты: android:paddingLeft,
android:paddingRight,
android:paddingTop и
android:paddingBottom.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

73.

Внутренние отступы Padding
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

74.

Внешние отступы Margin
Для установки внешних отступов используется атрибут layout_margin.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

75.

Программная установка отступов
Для программной установки внутренних отступов у элементы вызывается метод setPadding(left,
top, right, bottom), в который передаются четыре значения для каждой из сторон.
Для установки внешних отступов необходимо реализовать объект LayoutParams для того
контейнера, который применяется. И затем вызвать у этого объекта LayoutParams метод
setMargins(left, top, right, bottom):
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

76.

Макеты выравнивания. LinearLayout
Контейнер LinearLayout - объект ViewGroup, который упорядочивает все дочерние элементы в
одном направлении: по горизонтали или по вертикали. Направление разметки указывается с
помощью атрибута android:orientation.
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:layout_editor_absoluteX="83dp"
tools:layout_editor_absoluteY="178dp">
//вложенные эдементы
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation=«horizontal"
tools:layout_editor_absoluteX="83dp"
tools:layout_editor_absoluteY="178dp">
//вложенные эдементы
</LinearLayout>
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

77.

Макеты выравнивания. LinearLayout ч.2
LinearLayout поддерживает такое свойство, как вес элемента, которое
передается атрибутом android:layout_weight.
Это свойство принимает значение, указывающее, какую часть оставшегося
свободного места контейнера по отношению к другим объектам займет данный
элемент.
Например, если один элемент у нас будет иметь для свойства
android:layout_weight значение 2, а другой - значение 1, то в сумме они дадут 3,
поэтому первый элемент будет занимать 2/3 оставшегося пространства, а второй - 1/3.
Если все элементы имеют значение android:layout_weight="1", то все эти
элементы будут равномерно распределены по всей площади контейнера.
<TextView
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="#eeeeee"
android:text="Android"
android:layout_weight="1"
android:textSize="26sp" />
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

78.

Программное создание LinearLayout
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
TextView textView1 = new TextView(this);
textView1.setText("Hello");
linearLayout.addView(textView1, new LinearLayout.LayoutParams
(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
TextView textView2 = new TextView(this);
textView2.setText("Android");
linearLayout.addView(textView2, new LinearLayout.LayoutParams
(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
setContentView(linearLayout);
}
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

79.

Макеты выравнивания. TableLayout
Контейнер TableLayout структурирует элементы управления по столбцам и строкам.
Пример ниже содержит две строки и два столбца.
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
продолжение
<TableRow>
<TableRow>
<TextView
<TextView
android:layout_weight="0.5"
android:layout_weight="0.5"
android:text="Логин"
android:text="Email"
android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
android:layout_height="wrap_content" />
<EditText
<EditText
android:layout_weight="1"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
android:layout_height="wrap_content" />
</TableRow>
</TableRow>
</TableLayout>
Количество столбцов определяется максимальным количеством элементов в строке.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

80.

Макеты выравнивания. GridLayout
GridLayout представляет еще один контейнер, который позволяет создавать табличные
представления. GridLayout состоит из коллекции строк, каждая из которых состоит из
отдельных ячеек:
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:rowCount="3"
android:columnCount="3">
<Button android:text="1" />
<Button android:text="2" />
<Button android:text="3" />
<Button android:text="4" />
<Button android:text="5" />
<Button android:text="6" />
<Button android:text="7" />
<Button android:text="8" />
<Button android:text="9" />
</GridLayout>
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

81.

Макеты выравнивания. ScrollView
Контейнер ScrollView предназначен для создания
прокрутки в том случае, если все элементы
одномоментно не могут поместиться на экране
устройства. ScrollView может вмещать только один
элемент, поэтому если необходимо разместить
несколько элементов, то их надо поместить в какойнибудь контейнер, например, LinearLayout.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

82.

Выравнивание. Gravity
Атрибут gravity задает позиционирование содержимого внутри объекта.
Он может принимать следующие значения:
top: элементы размещаются вверху
bottom: элементы размещаются внизу
left: элементы размещаются в левой стороне
right: элементы размещаются в правой стороне контейнера
center_vertical: выравнивает элементы по центру по вертикали
center_horizontal: выравнивает элементы по центру по горизонтали
center: элементы размещаются по центру
fill_vertical: элемент растягивается по вертикали
fill_horizontal: элемент растягивается по горизонтали
fill: элемент заполняет все пространство контейнера
clip_vertical: обрезает верхнюю и нижнюю границу элементов
clip_horizontal: обрезает правую и левую границу элементов
start: элемент позиционируется в начале (в верхнем левом углу)
контейнера
end: элемент позиционируется в конце контейнера(в верхнем правом
углу)
<TextView
android:gravity="bottom"
android:layout_width="match_parent"
android:layout_height="200px"
android:text="Hello Android 7"
android:background="#e8eaf6"/>
</RelativeLayout>
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

83.

Выравнивание. Layout_gravity
layout_gravity устанавливает позиционирование в контейнере. Он принимает те же
значения, только позиционирование идет относительно внешнего контейнера:
top: выравнивает элемент по верхней границе контейнера
bottom: выравнивает элемент по нижней границе контейнера
left: выравнивает элемент по левой границе контейнера
right: выравнивает элемент по правой границе контейнера
center_vertical: выравнивает элемент по центру по вертикали
center_horizontal: выравнивает элемент по центру по горизонтали
center: элемент позиционируется в центре
fill_vertical: элемент растягивается по вертикали
fill_horizontal: элемент растягивается по горизонтали
fill: элемент заполняет все пространство контейнера
clip_vertical: обрезает верхнюю и нижнюю границу элемента
clip_horizontal: обрезает правую и левую границу элемента
start: элемент позиционируется в начале (в верхнем левом углу) контейнера
end: элемент позиционируется в конце контейнера (в верхнем правом углу)
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

84.

Элементы управления. TextView
TextView отображает текст без возможности его редактирования.
Основные атрибуты:
android:text: устанавливает текст элемента
android:textSize: устанавливает высоту текста, в качестве единиц измерения для указания высоты
используются sp
android:background: задает фоновый цвет элемента в виде цвета в шестнадцатиричной записи или
в виде цветового ресурса
android:textColor: задает цвет текста
android:textAllCaps: при значении true делает все символы в тексте заглавными
android:textDirection: устанавливает направление текста. По умолчанию используется направление
слева направо, но с помощью значения rtl можно установить направление справо налево
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

85.

Элементы управления. TextView ч.2
Основные атрибуты (продолжение):
android:textAlignment: задает выравнивание текста. Может принимать следующие значения:
center: выравнивание по центру
textStart: по левому краю
textEnd : по правому краю
viewStart: по левому краю
viewEnd: по правому краю
android:fontFamily: устанавливает тип шрифта. Может принимать следующие значения:
monospace
serif
serif-monospace
sans-serif
sans-serif-condensed
sans-serif-smallcaps
sans-serif-light
casual
cursive
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

86.

Элементы управления. TextView ч.3
<TextView
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_margin="10dp"
android:text="Hello Android 7"
android:fontFamily="sans-serif"
android:textSize="26sp"
android:background="#ffebee"
android:textColor="#f44336" />
<TextView
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_margin="10dp"
продолжение
<TextView
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_margin="10dp"
android:text="Hello Android 7"
android:textAlignment="textEnd"
android:textSize="26sp"
android:background="#e8eaf6"
android:textColor="#5c6bc0" />
android:text="Android Nougat"
android:textAllCaps="true"
android:textSize="26sp"
android:background="#ede7f6"
android:textColor="#7e57c2" />
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

87.

Элементы управления. EditText
EditText - подкласс класса TextView. Текстовое поле с возможностью ввода и редактирования
текста. В EditText использовать все те же возможности, что и в TextView.
Дополнительные атрибуты:
android:hint - задает текст, отображаемый в качестве подсказки;
android:inputType- задает вид клавиатуры для ввода
text: обычная клавиатура для ввода однострочного текста
textMultiLine: многострочное текстовое поле
TextEmailAddress: обычная клавиатура, на которой присутствует символ @,
ориентирована на ввод email
textUri: обычная клавиатура, на которой присутствует символ /, ориентирована на
ввод интернет-адресов
textPassword: клавиатура для ввода пароля
textCapWords: при вводе первый введенный символ слова представляет заглавную
букву, остальные - строчные
number: числовая клавиатура
phone: клавиатура в стиле обычного телефона
date: клавиатура для ввода даты
time: клавиатура для ввода времени
datetime: клавиатура для ввода даты и времени
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

88.

Элементы управления. EditText. Обработка ввода
EditText предоставляет возможность обработать введенные символы по мере ввода пользователя.
С помощью метода addTextChangedListener() здесь к элементу EditText добавляется слушатель ввода
текста - объект TextWatcher, метод которого onTextChanged вызывается при изменении текста и
отображает вводимый текст в TextView
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText editText = (EditText) findViewById(R.id.editText);
editText.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {}
public void onTextChanged(CharSequence s, int start,
int before, int count) {
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(s);
}
});
}
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

89.

Всплывающие окна. Toast
Для создания простых уведомлений в Android используется класс Toast. Фактически Toast
представляет всплывающее окно с некоторым текстом, которое отображается в течение некоторого
времени.
Объект Toast нельзя создать в коде разметки xml, например, в файл activity_main.xml. Toast
можно использовать только в коде java.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View view){
Toast toast = Toast.makeText(this, "Hello Android 7",Toast.LENGTH_LONG);
toast.show();
}
}
Позиционировать окно можно с помощью методов setGravity() и setMargin().
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

90.

Checkbox
Элементы Checkbox представляют собой флажки, которые могут находиться в отмеченном
и неотмеченном состоянии. Флажки позволяют производить множественный выбор из нескольких
значений. Атрибут android:onClick, как и в случае с простыми кнопками, позволяет задать
обработчик нажатия на флажок.
public void onCheckboxClicked(View view) {
// Получаем флажок
CheckBox language = (CheckBox) view;
// Получаем, отмечен ли данный флажок
boolean checked = language.isChecked();
TextView selection = (TextView) findViewById(R.id.selection);
// Смотрим, какой именно из флажков отмечен
switch(view.getId()) {
case R.id.java:
if (checked){
selection.setText("Java");
}
break;
case R.id.javascript:
if (checked)
selection.setText("JavaScript");
break;
}
}
Позиционировать окно можно с помощью методов setGravity() и setMargin().
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

91.

ToggleButton
ToggleButton подобно элементу CheckBox может пребывать в двух состояниях: отмеченном
и неотмеченном, причем для каждого состояния мы можем отдельно установить свой текст.
Фрагмент activity_main.xml
<ToggleButton
android:id="@+id/toggle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOn="Включено"
android:textOff="Выключено"
android:onClick="onToggleClicked"/>
Фрагмент MainActivity.java
public void onToggleClicked(View view) {
// включена ли кнопка
boolean on = ((ToggleButton) view).isChecked();
if (on) {
// действия если включена
Toast.makeText(this, "Свет включен", Toast.LENGTH_LONG).show();
} else {
// действия, если выключена
Toast.makeText(this, "Свет выключен!", Toast.LENGTH_LONG).show();
}
}
Позиционировать окно можно с помощью методов setGravity() и setMargin().
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

92.

Списки
Android представляет широкую палитру элементов, которые представляют списки. Все они
является наследниками класса android.widget.AdapterView. Это такие виджеты как ListView,
GridView, Spinner. Они могут выступать контейнерами для других элементов управления.
При работе со списками мы имеем дело с
тремя компонентами. Во-первых, это сам
элементы списков (ListView, GridView),
которые отображают данные. Во-вторых,
это источник данных - массив, объект
ArrayList, база данных и т.д., в котором
находятся сами отображаемые данные. И
в-третьих, это адаптеры - специальные
компоненты, которые связывают
источник данных с элементом списка.
Рассмотрим связь элемента ListView с
источником данных с помощью одного из
таких адаптеров - класса ArrayAdapter.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

93.

ListView и ArrayAdapter
Класс ArrayAdapter представляет собой простейший адаптер, который связывает массив данных с
набором элементов TextView, из которых, к примеру, может состоять ListView.
Разметка
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/countriesList"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</RelativeLayout>
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

94.

ListView и ArrayAdapter ч.2
Рассмотрим коду activity, связывающий ListView через ArrayAdapter с некоторыми данными:
public class MainActivity extends AppCompatActivity {
// набор данных, которые свяжем со списком
String[] countries = { "Бразилия", "Аргентина", "Колумбия", "Чили", "Уругвай"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// получаем элемент ListView
ListView countriesList = (ListView) findViewById(R.id.countriesList);
// создаем адаптер
ArrayAdapter<String> adapter = new ArrayAdapter(this,
android.R.layout.simple_list_item_1, countries);
// устанавливаем для списка адаптер
countriesList.setAdapter(adapter);
// добавляем для списка слушатель (см. следующий слайд)
}
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

95.

Обработка выбора ListView
Для обработки выбора элемента списка устанавливается слушатель OnItemClickListener. Этот
слушатель имеет один метод onItemClick, через параметры которого мы можем получить
выделенный элемент и сопутствующие данные.
Код activity
countriesList.setAdapter(adapter);
// добавляем для списка слушатель (продолжение)
countriesList.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
{
// выводим выбранный текст во всплывающем окне Toast
Toast.makeText(getApplicationContext(), ((TextView) itemClicked).getText(),
Toast.LENGTH_SHORT).show();
//получаем строку с выбранным текстом
TextView textView = (TextView) itemClicked;
String strText = textView.getText().toString();
ImageView imageView = findViewById(R.id.iView);
}
});
}
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

96.

Графические ресурсы
Лекция 4
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

97.

Ресурсы
Ресурс в приложении Android представляет собой файл, например, файл разметки
интерфейса, файл изображения, аудио/видео-файл или некоторое значение, например, простую
строку. То есть ресурсы представляют собой и файлы разметки, и отдельные строки, и звуковые
файлы, файлы изображений и т.д.
Все ресурсы находятся в проекте в каталоге res. Для различных типов ресурсов,
определенных в проекте, в каталоге res создаются подкаталоги. Поддерживаемые подкаталоги:
animator/: xml-файлы, определяющие анимацию свойств
anim/: xml-файлы, определяющие tween-анимацию
color/: xml-файлы, определяющие список цветов
drawable/: Графические файлы (.png, .jpg, .gif)
mipmap/: Графические файлы, используемые для иконок приложения под различные разрешения
экранов
layout/: xml-файлы, определяющие пользовательский интерфейс приложения
menu/: xml-файлы, определяющие меню приложения
raw/: различные файлы, которые сохраняются в исходном виде
values/: xml-файлы, которые содержат различные используемые в приложении значения,
например, ресурсы строк
xml/: Произвольные xml-файлы
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

98.

Работа с ресурсами
В стандартном проекте Android Studio каталог res содержит каталоги не для всех типов
ресурсов, которые использоваться в Android, однако при необходимости можно добавить в папку
res нужный каталог, а в него затем поместить ресурс.
Когда происходит компиляция проекта сведения обо всех ресурсах добавляются в
специальный файл R.java, который можно найти в проекте по
пути app\build\generated\source\r\debug\[пакет_приложения].
Существует два способа доступа к ресурсам: в файле исходного кода и в файле xml.
Ссылка на ресурсы в коде
Тип ресурса в данной записи ссылается на одно из пространств (внутренних классов),
определенных в файле R.java, которые имеют соответствующие им типы в xml:
R.drawable (ему соответствует тип в xml drawable)
R.id (id)
R.layout (layout)
R.string (string)
R.attr (attr)
R.plural (plurals)
R.array (string-array)
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

99.

Работа с ресурсами ч.2
Доступ в файле xml
Нередко возникает необходимость ссылаться на ресурс в файле xml, например, в файле,
который определяет визуальный интерфейс, к примеру, в activity_main.xml. Ссылки на ресурсы в
файлах xml имеют следующую формализованную форму:
@[имя_пакета:]тип_ресурса/имя_ресурса
имя_пакета представляет имя пакета, в котором ресурс находится (указывать
необязательно, если ресурс находится в том же пакете)
тип_ресурса представляет подкласс, определенный в классе R для типа ресурса
имя_ресурса имя файла ресурса без расширения или значение атрибута android:name в
XML-элементе (для простых значений).
Например, мы хотим вывести в элемент TextView строку, которая определена в виде
ресурса в файле strings.xml:
<TextView
android:id="@+id/welcome"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name" />
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

100.

Работа с ресурсами ч.3
Для получения ресурсов в классе Activity мы можем использовать метод getResources(),
который возвращает объект android.content.res.Resources. Но чтобы получить сам ресурс,
нам надо у полученного объекта Resources вызвать один из методов:
•getString(): получает строку из файла strings.xml по числовому идентификатору
•getDimension(): получает числовое значение - ресурс dimen
•getDrawable(): получает графический файл
•getBoolean(): получает значение boolean
Код activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// получение ресурсов из файла values/strings.xml
String app_name = getResources().getString(R.string.app_name);
TextView textView = new TextView(this);
textView.setText(app_name);
setContentView(textView);
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

101.

Ресурсы изображений
Одним из наиболее распространенных источников ресурсов являются файлы изображений.
Android поддерживает следующие форматы файлов: .png (предпочтителен), .jpg
(приемлем), .gif (нежелателен).
Для графических файлов в проекте уже по умолчанию создана папка res/drawable.
При добавлении графических файлов в эту папку для каждого из них Android создает ресурс
Drawable. После этого мы можем обратиться к ресурсу следующим образом:
В коде Java:
R.drawable.имя_файла
В коде xml:
@[имя_пакета:]drawable/имя_файла
Стоит учитывать, что файл изображения будет добавляться в приложение, тем самым увеличивая
его размер. Кроме того, большие изображения отрицательно влияют на производительность.
Поэтому следует использовать небольшие и оптимизрованные (сжатые) графические файлы.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

102.

Работа с ресурсами изображений
Для работы с изображениями в Android можно использовать различные элементы, но
непосредственно для вывода изображений предназначен ImageView.
Разметка
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/имя_файла_без_расширения" />
Код activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//для примера создаем НОВЫЙ ImageView
ImageView imageView = new ImageView(this);
// применяем ресурс
imageView.setImageResource(R.drawable.имя_файла_без_расширения);
//setContentView(R.layout.activity_main);
setContentView(imageView);
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

103.

ImageView
Рассмотрим возможности масштабирования изображения, которое задается с помощью
перечисления. Это перечисление определяет следующие значения:
• CENTER: изображение центрируется по центру без масштабирования
• CENTER_CROP: изображение центрируется по центру и масштабируется с сохранением аспектного
отношения между шириной и высотой. Если какая-то часть не помещается в пределы экрана, то
она обрезается
• CENTER_INSIDE: изображение центрируется по центру и масштабируется с сохранением
аспектного отношения между шириной и высотой, но ширина и высота не могут быть больше
ширины и высоты ImageView
• FIT_CENTER: изображение масштабируется и центрируется
• FIT_START: изображение масштабируется и устанавливается в начало элемента (вверх при
портретной оринетации и влево - при альбомной)
• FIT_END: изображение масштабируется и устанавливается в конец элемента (вниз при
портретной оринетации и вправо - при альбомной)
• FIT_XY: изображение масштабируется без сохранения аспектного отношения между шириной и
высотой, заполняя все пространство ImageView
• MATRIX: изображение масштабируется с применением матрицы изображения
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

104.

ImageView ч.2
Масштабирование изображения в разметке:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/fileName"
android:scaleType="fitXY"/>
Масштабирование изображения в коде Java:
ImageView imageView = new ImageView(this);
imageView.setImageResource(R.drawable.fileName);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

105.

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

106.

Жизненный цикл activity
Все объекты activity представляют
собой объекты класса android.app.Activity,
которая содержит базовую
функциональность для всех activity.
После запуска activity проходит
через ряд событий, которые
обрабатываются системой и для обработки
которых существует ряд обратных вызовов:
protected void onCreate(Bundle saveInstanceState);
protected void onStart();
protected void onRestoreInstanceState(Bundle
saveInstanceState);
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onSaveInstanceState(Bundle
saveInstanceState);
protected void onStop();
protected void onDestroy();

107.

Методы activity
onCreate()
onCreate - первый метод, с которого начинается выполнение activity. В этом методе
activity переходит в состояние Created. Этот метод обязательно должен быть
определен в классе activity. В нем производится первоначальная настройка activity.
В частности, создаются объекты визуального интерфейса. Этот метод получает
объект Bundle, который содержит прежнее состояние activity, если оно было
сохранено. Если activity заново создается, то данный объект имеет значение null.
Если же activity уже ранее была создана, но находилась в приостановленном
состоянии, то bundle содержит связанную с activity информацию.
onStart()
В методе onStart() осуществляется подготовка к выводу activity на экран
устройства. Как правило, этот метод не требует переопределения, а всю работу
производит встроенный код. После завершения работы метода activity отображается
на экране, вызывается метод onResume, а activity переходит в состояние Resumed.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

108.

Методы activity (ч.2)
onRestoreInstanceState
После завершения метода onStart() вызывается метод
onRestoreInstanceState, который призван восстанавливать сохраненное
состояние из объекта Bundle, который передается в качестве параметра. Но
следует учитывать, что этот метод вызывается только тогда, когда Bundle не
равен null и содержит ранее сохраненное состояние. Так, при первом запуске
приложения этот объект Bundle будет иметь значение null, поэтому и метод
onRestoreInstanceState не будет вызываться.
onResume
При вызове метода onResume activity переходит в состояние Resumed, а
пользователь может с ней взаимодействовать. И собственно activity остается в
этом состоянии, пока она не потеряет фокус, например, вследствии
переключения на другую activity или просто из-за выключения экрана
устройства.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

109.

Методы activity (ч.3)
onPause
Если пользователь решит перейти к другой activity, то система вызывает метод
onPause. В этом методе можно освобождать используемые ресурсы, приостанавливать
процессы, например, воспроизведение аудио, анимаций, останавливать работу камеры (если
она используется) и т.д., чтобы они меньше сказывались на производительность системы.
Но надо учитывать, что на работу данного метода отводится очень мало времени,
поэтому не стоит здесь сохранять какие-то данные, особенно если при этом требуется
обращение к сети, например, отправка данных по интернету, или обращение к базе данных.
После выполнения этого метода activity становится невидимой, не отображается на
экране, но она все еще активна. И если пользователь решит вернуться к этой activity, то
система вызовет снова метод onResume, и activity снова появится на экране.
Другой вариант работы может возникнуть, если вдруг система видит, что для
работы активных приложений необходимо больше памяти. И система может сама
завершить полностью работу activity, которая невидима и находится в фоне. Либо
пользователь может нажать на кнопку Back (Назад). В этом случае у activity вызывается
метод onStop.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

110.

Методы activity (ч.4)
onSaveInstanceState
Метод onSaveInstanceState вызывается после метода onPause(), но до вызова
onStop(). В onSaveInstanceState производится сохранение состояния приложения в
передаваемый в качестве параметра объект Bundle.
onStop
В этом методе activity переходит в состояние Stopped. В методе onStop следует
особождать используемые ресурсы, которые не нужны пользователю, когда он не
взаимодействует с activity. Здесь также можно сохранять данные, например, в базу
данных.
При этом во время состояния Stopped activity остается в памяти устройства,
сохраняется состояние всех элементов интерфейса. К примеру, если в текстовое поле
EditText был введен какой-то текст, то после возобновления работы activity и перехода ее
в состояние Resumed мы вновь увидим в текстовом поле ранее введенный текст.
Если после вызова метода onStop пользователь решит вернуться к прежней activity, тогда
система вызовет метод onRestart. Если же activity вовсе завершила свою работу,
например, из-за закрытия приложения, то вызывается метод onDestroy().
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

111.

Методы activity (ч.5)
onDestroy
Завершается работа активности вызовом метода onDestroy, который возникает либо,
если система решит убить activity, либо при вызове метода finish().
Также следует отметить, что при изменении ориентации экрана система завершает activity
и затем создает ее заново, вызывая метод onCreate.
activity

112.

Создание Activity в Android Studio
Создание новой Activity в Android Studio выполняется через меню File-New-Activity(Выбор шаблона), или через контекстное меню New->Activity->Empty Activity, если
выбрана папка, в которой находится класс MainActivity.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

113.

Настройка Activity
Далее необходимо выполнить настройку
Activity, которая заключается в определении ее
имени и имени файла разметки.
После этого информация об Activity
автоматически добавится в файл манифеста.
<activity
android:name=".MainActivity">
<intent-filter>
<action
android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity"></activity>
Для MainActivity в элементе intent-filter определяется интент-фильтр. В нем элемент action
значение "android.intent.action.MAIN" определяет главную точку входа в приложение.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

114.

Вызов Activity
Чтобы из MainActivity запустить SecondActivity, надо вызвать метод startActivity():
Код Mainactivity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View view) {
Передача данных
между Activity
Intent intent = new Intent(this,
SecondActivity.class);
startActivity(intent);
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

115.

Передача данных между Activity
Для передачи данных между двумя Activity используется объект Intent. Через его метод putExtra()
можно добавить ключ и связанное с ним значение.
Например, передача из текущей activity в SecondActivity строки "Hello World" с ключом "hello":
Код Mainactivity
// создание объекта Intent для запуска SecondActivity
Intent intent = new Intent(this, SecondActivity.class);
// передача объекта с ключом “name" и значением “Piter"
intent.putExtra(“name", “Piter");
// запуск SecondActivity
startActivity(intent);
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

116.

Прием данных в Activity
В зависимости от типа отправляемых данных при их получении можно использовать ряд методов
объекта Bundle. Все они в качестве параметра принимают ключ объекта. Основные из них:
get(): универсальный метод, который возвращает значение типа Object. Соответственно поле
получения данное значение необходимо преобразовать к нужному типу
• getString(): возвращает объект типа String
• getInt(): возвращает значение типа int
• getByte(): возвращает значение типа byte
• getChar(): возвращает значение типа char
• getShort(): возвращает значение типа short
• getLong(): возвращает значение типа long
• getFloat(): возвращает значение типа float
• getDouble(): возвращает значение типа double
• getBoolean(): возвращает значение типа boolean
• getCharArray(): возвращает массив объектов char
• getIntArray(): возвращает массив объектов int
• getFloatArray(): возвращает массив объектов float
• getSerializable(): возвращает объект интерфейса Serializable
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

117.

Прием данных в Activity ч.2
Пример получения данных при загрузке SecondActivity с использованием метода get()
Код Secondactivity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle arguments = getIntent().getExtras();
if(arguments!=null){
String name = arguments.get("name").toString();
}
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

118.

Стили и темы. Фрагменты.
Неявные намерения
Лекция 5
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

119.

Стили ч.1
Настройка элементов интерфейса выполняется с помощью различных атрибутов,
которые задают высоту, ширину, цвет фона, текста и так далее.
Если несколько элементов используют одни и те же настройки, то можно объединить эти
настройки в стиль. Использование стилей позволяет легко менять настройки отображения у
группы элементов.
Для хранения стилей в Android используется файл res/values/styles.xml:
Содержимое styles.xml
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

120.

Стили ч.2
Рассмотрим пример определения и использования стиля для группы элементов TextView
Исходной содержимое
файла разметки
Определение стиля TextViewStyle
в файле styles.xml
Использование стиля TextViewStyle
В файле разметки
Стили рекомендуется использовать только для
семантически идентичных
элементов (например – кнопки калькулятора).
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

121.

Темы
Тема – способ использования стиля не к отдельному элементу, а ко всему приложению
или Activity. Первоначальное содержимое файла styles.xml (см. слайд 2), описывает тему
приложения AppTheme, которая подключается в файле манифеста:
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

122.

Темы ч.2
Определение темы происходит с помощью в том же файле res/values/styles.xml, где
определяются стили и выполняется с использованием того же синтаксиса, что и для
определения стиля.
При определении тем можно использовать стандартные темы Android
parent="Theme.AppCompat.Light.
parent="Theme.AppCompat.Light.
с использованием атрибута parent и:
DarkActionBar"
NoActionBar"
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

123.

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

124.

Фрагменты ч.2
Фрагмент существует в контексте Activity и имеет свой жизненный
цикл. Вне Activity обособлено фрагмент существовать не может.
Каждая Activity может иметь несколько фрагментов. При этом один
фрагмент может использоваться несколькими Activity.
Для создания фрагмента, как и для Activity необходимо создать два
файла: файл разметки и файл класса.
Так как фрагмент содержит такие же элементы управления, что и
activity, файл разметки создается в папке res/layout.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

125.

Фрагменты ч.3
Для создания файла разметки фрагмента необходимо выбрать в контекстном меню
New-XML-Layout XML File.
Пример файла разметки fragment_content.xml:
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

126.

Фрагменты ч.4
Класс фрагмента создается в одной папке с MainActivity. Для создания следует
нажать на папку правой кнопкой мыши и выбрать в меню New - Java Class.
Пример класса ContentFragment (родительский класс - Fragment)

127.

Фрагменты ч.5
Для создания визуального интерфейса фрагмент переопределяет родительский
метод onCreateView(). Он принимает три параметра:
Объект LayoutInflater используется для установки ресурса разметки для создания
интерфейса;
Параметр ViewGroup container устанавливает контейнер интерфейса;
Параметр Bundle savedInstanceState передает ранее сохраненное состояние.
Для создания интерфейса применяется метод inflate() объекта LayoutInflater.
Он получает ресурс разметки layout для данного фрагмента, контейнер, в который будет
заключен интерфейс, и третий булевый параметр указывает, надо ли прикреплять разметку
к контейнеру из второго параметра.
Как и в Activity, здесь можно устанавливать обработчики для элементов
управления, обрабатывать их события. В вышеприведенном примере в текстовом поле
выводится текущая дата.
Помимо организации интерфейса для разных размеров экрана, фрагменты часто
используются для организации альбомного и портретного режимов работы, для
пролистывания страниц в ViewPager, для организации диалоговых окон и т.д.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

128.

Работа с сетью. WebView
WebView представляет простейший элемент для рендеринга html-кода,
базирующийся на движке WebKit. Благодаря этому можно использовать
WebView как примитивный веб-браузер, просматривая через него контент из
сети интернет. Использование движка WebKit гарантирует, что отображение
контента будет происходить примерно также, как и в других браузерах,
построенных на этом движке - Google Chrome и Safari.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

129.

WebView ч.1
Для работы с WebView первым делом необходимо определить элемент
в разметке:
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

130.

WebView ч.2
Для получения доступа к интернету из приложения,
необходимо указать в файле манифеста AndroidManifest.xml
соответствующее разрешение:
Чтобы загрузить определенную страницу в
WebView, через метод loadUrl() надо установить ее адрес:
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

131.

WebView ч.3
Доступ к интернету можно получить также путем
создания намерения (Intent) с предопределённым действием
ACTION_VIEW для запуска браузера и перехода на нужный
адрес:
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

132.

Неявные намерения.
На предыдущем слайде приведен пример неявного вызова активности. При
таком подходе не указывается имя активности, а указывается один или несколько
параметров из перечня action, data, category с определёнными значениями.
Создавая новое неявное намерение для передачи в метод startActivity(),
необходимо назначить действие, которое должно выполниться, а также при
желании указать вспомогательный путь URI к тем данным, что нужно обработать.
В вышерассмотренном примере в качестве действия указана константа
ACTION_VIEW, а в качестве данных – адрес сайта в пути URI.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

133.

Константы действия
Рассмотрим наиболее используемые константы действия:
ACTION_VIEW — Наиболее распространённое общее действие. Для
данных, передаваемых с помощью пути URI в намерении, ищется наиболее
подходящий способ вывода. Выбор приложения зависит от схемы (протокола)
данных. Стандартные адреса http: будут открываться в браузере, адреса tel: — в
приложении для дозвона, geo: — в программе Google Maps, а данные о контакте
— отобразятся в приложении для управления контактной информацией;
ACTION_WEB_SEARCH — Открывает активность, которая ведет поиск в
интернете, основываясь на тексте, переданном с помощью пути URI (как
правило, при этом запускается браузер);
ACTION_CALL — инициализирует обращение по телефону;
ACTION_DELETE — Запускает активность, с помощью которой можно
удалить данные, указанные в пути URI внутри намерения;
ACTION_EDIT — Отображает данные для редактирования пользователем
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

134.

Константы действия
Рассмотрим наиболее используемые константы действия:
ACTION_VIEW — Наиболее распространённое общее действие. Для
данных, передаваемых с помощью пути URI в намерении, ищется наиболее
подходящий способ вывода. Выбор приложения зависит от схемы (протокола)
данных. Стандартные адреса http: будут открываться в браузере, адреса tel: — в
приложении для дозвона, geo: — в программе Google Maps, а данные о контакте
— отобразятся в приложении для управления контактной информацией;
ACTION_WEB_SEARCH — Открывает активность, которая ведет поиск в
интернете, основываясь на тексте, переданном с помощью пути URI (как
правило, при этом запускается браузер);
ACTION_CALL — инициализирует обращение по телефону;
ACTION_DELETE — Запускает активность, с помощью которой можно
удалить данные, указанные в пути URI внутри намерения;
ACTION_EDIT — Отображает данные для редактирования пользователем;
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

135.

Константы действия ч.2
ACTION_PICK - Загружает дочернюю Активность, позволяющую выбрать
элемент из источника данных, указанный с помощью пути URI. При закрытии
должен возвращаться URI, ссылающийся на выбранный элемент. Активность,
которая будет запущена, зависит от типа выбранных данных, например при
передаче пути content://contacts/people вызовется системный список контактов;
ACTION_SEARCH — Запускает активность для выполнения поиска.
Поисковый запрос хранится в виде строки в дополнительном параметре
намерения по ключу SearchManager.QUERY
ACTION_SENDTO — Открывает активность для отправки сообщений
контакту, указанному в пути URI, который передаётся через намерение
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

136.

Запуск приложения Camera
Простейший способ запуска системного
приложения Camera также реализуется через намерение.
При этом Вашему приложению даже не требуются
дополнительные разрешения:
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

137.

Вызов камеры и отображение фото в ImageView
package nam.example.camerafragments;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
private static final int CAMERA_REQUEST = 0;
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.imageView);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {
// Фотка сделана, извлекаем картинку
Bitmap thumbnailBitmap = (Bitmap) data.getExtras().get("data");
imageView.setImageBitmap(thumbnailBitmap);
}
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

138.

Телефонные звонки
import android.view.Menu;
import android.view.MenuItem;
import android.content.Intent;
import android.view.View;
import android.widget.EditText;
import android.net.Uri;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void dial(View v) {
EditText number=(EditText)findViewById(R.id.number);
String toDial="tel:"+number.getText().toString();
startActivity(new Intent(Intent.ACTION_DIAL,
Uri.parse(toDial)));
}
} При замене Intent.ACTION_DIAL на Intent.ACTION_CALL звонок будет осуществляться сразу.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

139.

Отправка сообщений ч.1
Разметка
Java код
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

140.

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

141.

Работа с файловой системой и
системными приложениями
Лекция 6
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

142.

Работа с файловой системой
ОС Android построена на основе Linux. Поэтому в путях к файлам в
качестве разграничителя в Linux использует слеш "/", а не обратный слеш "\"
(как в Windows).
Названия файлов и каталогов являются регистрозависимыми, то есть
"data" это не то же самое, что и "Data".
Приложение Android сохраняет свои данные в каталоге
/data/data/<название_пакета>/ и, как правило, относительно этого каталога будет
идти работа.
Все файлы, которые создаются и редактируются в приложении, как
правило, хранятся в подкаталоге /files в каталоге приложения и по умолчанию
доступны только самому приложению.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

143.

Методы работы с файловой системой
Для работы с файлами абстрактный класс android.content.Context определяет ряд
методов:
deleteFile(String name): удаляет определенный файл
fileList(): получает все файлы, которые содержатся в подкаталоге /files в каталоге
приложения
getCacheDir(): получает ссылку на подкаталог cache в каталоге приложения
getDir(String dirName, int mode): получает ссылку на подкаталог в каталоге
приложения, если такого подкаталога нет, то он создается
getExternalCacheDir(): получает ссылку на папку /cache внешней файловой системы
устройства
getExternalFilesDir(): получает ссылку на каталог /files внешней файловой системы
устройства
getFileStreamPath(String filename): возвращает абсолютный путь к файлу в файловой
системе
openFileInput(String filename): открывает файл для чтения
openFileOutput (String name, int mode): открывает файл для записи
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

144.

Пример сохранения файла в каталог приложения
public void saveText(View view){
FileOutputStream fos = null;
try {
EditText textBox = (EditText) findViewById(R.id.save_text);
String text = textBox.getText().toString();
fos = openFileOutput(FILE_NAME, MODE_PRIVATE);
fos.write(text.getBytes());
Toast.makeText(this, "Файл сохранен", Toast.LENGTH_SHORT).show();
}
catch(IOException ex) {
Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show();
}
finally{
try{
if(fos!=null)
fos.close();
}
catch(IOException ex){
Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show();
}
Введенный текст будет
сохраняться в файл, указанный в
FILE_NAME ("content.txt").
При этом используется режим
MODE_PRIVATE.
Система позволяет создавать файлы с
двумя разными режимами:
•MODE_PRIVATE: файл
перезаписывается;
•MODE_APPEND: данные добавляются
в конец файла
В данном случае если файл
"content.txt" уже существует, то он будет
перезаписан. Если же надо дописать
файл, тогда следует использовать режим
MODE_APPEND.
}
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

145.

Пример открытия файла из каталога приложения
public void openText(View view){
FileInputStream fin = null;
TextView textView = (TextView) findViewById(R.id.open_text);
try {
fin = openFileInput(FILE_NAME);
byte[] bytes = new byte[fin.available()];
fin.read(bytes);
String text = new String (bytes);
textView.setText(text);
}
catch(IOException ex) {
Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show();
}
finally{
Если файл не сохранялся,
try{
то можно увидеть путь
if(fin!=null)
fin.close();
установки приложения
}
catch(IOException ex){
Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

146.

Работа с файлами во внешнем хранилище
В рассмотренных выше примерах сохранение и чтение файлов
осуществлялось в каталоге приложения. Поэтому имя файла указывалось без
указания путей.
private final static String FILE_NAME = "content.txt";
По умолчанию такие файлы доступны только самому приложению.
Рассмотрим как работать с файлами из внешнего хранилища.
Весь механизм работы с файлами сохраняется, а ключевым отличием
является получение и использование пути к внешнему хранилищу через метод
Environment.getExternalStorageDirectory().
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

147.

Размещение файлов во внешнем хранилище ч.3
С помощью выражения Environment.getExternalStorageDirectory() необходимо
получить доступ к папке приложения во внешнем хранилище и установить
объект файла. Для этого описываем метод:
private File getExternalPath() {
return(new File(Environment.getExternalStorageDirectory(), FILE_NAME));
}
В процедуре сохранения файла строку:
fos = openFileOutput(FILE_NAME, MODE_PRIVATE); ,
заменяем строкой:
fos = new FileOutputStream(getExternalPath());
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

148.

Чтение файлов из внешнего хранилища
В упрощенном виде (без проверки разрешений и обработки исключений) метод
чтения файла выглядит следующим образом:
public void openText(View view){
FileInputStream fin = null;
TextView textView = (TextView) findViewById(R.id.open_text);
File file = getExternalPath();
// если файл не существует, выход из метода
if(!file.exists()) return;
try {
fin = new FileInputStream(file);
byte[] bytes = new byte[fin.available()];
fin.read(bytes);
String text = new String (bytes);
textView.setText(text);
}
}
Для работы с внешним хранилищем необходимы разрешения, поэтому перед
операциями сохранения и записи файла необходимо проверить их наличие. Более подробная
информация об этом в МУ к ЛР №3.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

149.

Файловый менеджер через неявные намерения
Используя константу действия ACTION_GET_CONTENT можно легко
реализовать файловый менеджер через неявное намерение.
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType(«*/*");
startActivityForResult(intent,PICKFILE_RESULT_CODE);
}
//переопределение метода
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode){
case PICKFILE_RESULT_CODE:
if(resultCode == RESULT_OK){
String FilePath = data.getData().getPath();
String FileName = data.getData().getLastPathSegment();
int lastPos = FilePath.length() - FileName.length();
String Folder = FilePath.substring(0, lastPos);
textView.setText("Full Path: \n" + FilePath + "\n");
Uri address = Uri.parse(FilePath);
}
break;
}
}

150.

Работа с видео
Для работы с видеоматериалами в стандартном наборе виджетов
Android определен класс VideoView, который позволяет воспроизводить
видео.
Какие форматы видео можно использовать? Android поддерживает все
те же форматы видео, что и HTML 5, в частности, формат MPEG-4 H.264
(еще известный как WebM), который является оптимальным для Android. Но
также можно использовать распространенные форматы MPEG4 H.264 AVC
(.mp4) и MPEG4 SP (.3gp)
VideoView может работать как с роликами, размещенными на
мобильном устройстве, так и с видеоматериалами из сети.
Файл разметки:
<VideoView android:id="@+id/videoPlayer"
android:layout_gravity="center"
android:layout_height="match_parent"
android:layout_width="match_parent"/>
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

151.

Работа с видео ч.2
public class MainActivity extends AppCompatActivity {
VideoView videoPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
videoPlayer = (VideoView)findViewById(R.id.videoPlayer);
Uri myVideoUri= Uri.parse( "android.resource://" + getPackageName() + "/" + R.raw.gu);
videoPlayer.setVideoURI(myVideoUri);
}
public void play(View view){
videoPlayer.start();
}
public void pause(View view){
videoPlayer.pause();
}
public void stop(View view){
videoPlayer.stopPlayback();
videoPlayer.resume();
}
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

152.

Воспроизведение аудио
Для воспроизведения музыки и других аудиоматериалов Android предоставляет
класс MediaPlayer.
Чтобы воспроизводить аудио, MediaPlayer должен знать, какой именно ресурс
(файл) нужно производить. Установить нужный ресурс для воспроизведения можно
тремя способами:
в метод create() объекта MediaPlayer передается id ресурса, представляющего аудиофайл
в метод create() объекта MediaPlayer передается объект Uri, представляющего аудиофайл
в метод setDataSource() объекта MediaPlayer передается полный путь к аудиофайлу
После установки ресурса вызывается метод prepare() или prepareAsync()
(асинхронный вариант prepare()). Этот метод подготавливает аудиофайл к
воспроизведению, извлекая из него первые секунды. Если мы воспроизводим файл из
сети, то лучше использовать prepareAsync().
Методы управления воспроизведением в классе MediaPlayer:
start(): запускает аудио
pause(): приостанавливает воспроизведение
stop(): полностью останавливает воспроизведение
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

153.

Воспроизведение аудио ч.2
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPlayer=MediaPlayer.create(this, R.raw.music);
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
stopPlay();
}
});
startButton = (Button) findViewById(R.id.start);
pauseButton = (Button) findViewById(R.id.pause);
stopButton = (Button) findViewById(R.id.stop);
pauseButton.setEnabled(false);
stopButton.setEnabled(false);
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

154.

Воспроизведение аудио ч.3
private void stopPlay(){
mPlayer.stop();
pauseButton.setEnabled(false);
stopButton.setEnabled(false);
try {
mPlayer.prepare();
mPlayer.seekTo(0);
startButton.setEnabled(true);
}
catch (Throwable t) {
Toast.makeText(this, t.getMessage(), Toast.LENGTH_SHORT).show();
}
}
public void play(View view){
mPlayer.start();
startButton.setEnabled(false);
pauseButton.setEnabled(true);
stopButton.setEnabled(true);
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

155.

Воспроизведение аудио ч.4
public void pause(View view){
mPlayer.pause();
startButton.setEnabled(true);
pauseButton.setEnabled(false);
stopButton.setEnabled(true);
}
public void stop(View view){
stopPlay();
}
@Override
public void onDestroy() {
super.onDestroy();
if (mPlayer.isPlaying()) {
stopPlay();
}
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

156.

Сервисы.
Широковещательные
приемники.
Работа с базами данных
Лекция 7
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

157.

Сервисы
Сервисы предназначены для выполнения долговременных задач без
вмешательства пользователя и поэтому, в отличие от activity, не требуют наличия
визуального интерфейса.
Все сервисы наследуются от класса Service и проходят следующие этапы
жизненного цикла:
Метод onCreate(): вызывается при создании сервиса;
Метод onStartCommand(): вызывается при получении сервисом
команды, отправленной с помощью метода startService();
Метод onBind(): вызывается при закреплении клиента за сервисом с
помощью метода bindService();
Метод onDestroy(): вызывается при завершении работы сервиса.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

158.

Простейшее приложение с сервисом
Создадим простейшее приложение
с сервисом. Сервис будет воспроизводить
музыкальный файл. В начале добавим в
проект в каталог res папку raw и в нее
поместим mp3-файл (1). Затем добавим
новый класс сервиса. Назовем его
MediaService (2). Сервис может быть
создан как новый класс Java или с
использованием шаблона New Service
component.
Преимущество второго способа
(следующий слайд) заключается в том,
что создаваемый сервис сразу
регистрируется в манифесте.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

159.

Создание сервиса с использованием шаблона
Шаблон для сервиса
Регистрация сервиса в манифесте
Шаблонный код сервиса
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

160.

Переопределение методов сервиса
public class MediaService extends Service {
MediaPlayer ambientMediaPlayer; //создаем объект медиаплеера
@Override //код метода IBinder не изменяем
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override // инициализируем медиаплеер с помощью файла mouse.mp3
public void onCreate(){
ambientMediaPlayer=MediaPlayer.create(this, R.raw.mouse);
ambientMediaPlayer.setLooping(true); //зацикливаем воспроизведение файла
}
@Override // запускаем воспроизведение файла mouse.mp3
public int onStartCommand(Intent intent, int flags, int startId){
ambientMediaPlayer.start();
return START_STICKY;
}
@Override //завершаем воспроизведение
public void onDestroy() {
ambientMediaPlayer.stop();
}
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

161.

Управление сервисом
Для управления сервисом создадим простейший интерфейс, состоящий из
кнопок «Старт» и «Стоп», и имеющих общий обработчик событий:
public void click(View v) {
Intent i=new Intent(this, MediaService.class);
if (v.getId()==R.id.start) {
startService(i);
}
else {
stopService(i);
}
}
Сервис, запущенный кнопкой
«Старт», будет выполняться, даже
если закрыть приложение.
Остановить воспроизведение
можно запустив приложение
повторно и нажав кнопку «Стоп»
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

162.

Широковещательные приемники
Приемник широковещательных сообщений (Broadcast receiver)
представляет собой компонент, который реагирует на объявления
распространяемые по всей системе. Многие из этих объявлений рассылает
система — например объявление о том, что экран выключился, аккумулятор
разряжен или был сделан фотоснимок, установлено приложение и т.д. Объявления
также могут рассылаться приложениями, — например, чтобы сообщить другим
приложениям о том, что какие-то данные были загружены на устройство и теперь
готовы для использования. Несмотря на то что приемники широковещательных
сообщений не имеют пользовательского интерфейса, они могут создавать
уведомления в строке состояния, чтобы предупредить пользователя о событии
"рассылка объявления".
Однако чаще всего они являются просто "шлюзом"
для других компонентов и предназначены для выполнения минимального объема
работы. Например , они могут инициировать выполнение службой определенных
действий при возникновении события.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

163.

Широковещательные сообщения
Широковещательные сообщения могут поступать из разных точек:
из других приложений;
из самой системы;
из вашего приложения.
Примером широковещательного сообщения является трансляция
(broadcast) – сообщение, заключенное в объект Intent.
Трансляция может быть неявной или явной.
Неявная широковещательная трансляция (implicit broadcast) — это
трансляция, не предназначенная специально для вашего приложения. Чтобы
получить ее, необходимо использовать IntentFilter в манифесте приложения.
Явная трансляция (explicit broadcast) —предназначена специально для
вашего приложения благодаря использованию атрибута target, который
содержит имя пакета приложения или имя класса компонента.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

164.

Объявление приемника широковещательного сообщения
Существует два способа объявить приемник:
1. Статический способ - объявление приемника в файле AndroidManifest.xml в блоке
<application> с тегом <receiver> :
<receiver android:name=".MyReciever" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
Заявленный широковещательный приемник имеет свойство exported = ”true”, что
обозначает, что он может принимать широковещательные сообщения вне области
приложения. Т.о., при статической регистрации приложение получит сообщение, даже
если оно не запущено.
2. Динамический способ – регистрация экземпляра с помощью registerReceiver:
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

165.

Реализация Broadcast Receivers
Broadcast Receiver представляет собой класс Java, родителем которого является
класс BroadcastReceiver. Приемник можно создать вручную или воспользоваться
специальным шаблоном: New->Other-> Broadcast Receiver.
Пример широковещательного приемника:
public class MyReciever extends BroadcastReceiver {
// Переопределяем метод onReceive()
@Override
public void onReceive(Context rcvContext, Intent rcvIntent) {
String action = rcvIntent.getAction();
// Если действие = Intent.ACTION_PACKAGE_ADDED
if (action.equals(Intent.ACTION_PACKAGE_ADDED)) {
// то запускаем сервис MediaService
rcvContext.startService(new Intent(rcvContext,
MediaService.class));
}
}
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

166.

Работа с базами данных SQLite
В Android имеется встроенная поддержка одной из распространенных
систем управления базами данных - SQLite. Для этого в пакете
android.database.sqlite определен набор классов, которые позволяют работать с
базами данных SQLite.
Чтобы использовать SQLite в Android, можно создать базу данных с
помощью выражение на языке SQL:
SQLiteDatabase db = getBaseContext().openOrCreateDatabase("app.db", MODE_PRIVATE, null);
После этого база данных будет храниться в каталоге приложения по пути:
DATA/data/[Название_приложения]/databases/[Название_файла_базы_данных]
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

167.

Средства взаимодействия с базами данных
Основную функциональность по работе с базами данных предоставляет
пакет android.database.
Функциональность непосредственно для работы с SQLite находится в
пакете android.database.sqlite.
База данных в SQLite представлена классом
android.database.sqlite.SQLiteDatabase. Он позволяет выполнять запросы к БД,
выполнять с ней различные манипуляции.
Класс android.database.sqlite.SQLiteCursor предоставляет запрос и
позволяет возвращать набор строк, которые соответствуют этому запросу.
Класс android.database.sqlite.SQLiteQueryBuilder позволяет создавать
SQL-запросы.
Класс android.database.sqlite.SQLiteOpenHelper позволяет создать базу
данных со всеми таблицами, если их еще не существует.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

168.

Простейшее приложение для работы с БД
public void onClick(View view){
SQLiteDatabase db = getBaseContext().openOrCreateDatabase("app.db",
MODE_PRIVATE, null);
db.execSQL("CREATE TABLE IF NOT EXISTS users (name TEXT, age INTEGER)");
db.execSQL("INSERT INTO users VALUES ('Tom Smith', 23);");
db.execSQL("INSERT INTO users VALUES ('John Dow', 31);");
Cursor query = db.rawQuery("SELECT * FROM users;", null);
TextView textView = (TextView) findViewById(R.id.textView);
if(query.moveToFirst()){
do{
String name = query.getString(0);
int age = query.getInt(1);
textView.append("Name: " + name + " Age: " + age + "\n");
}
while(query.moveToNext());
}
query.close();
db.close();
}
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

169.

Получение данных и Cursor
Android предоставляет различные способы для осуществления запросов к
объекту SQLiteDatabase. В большинстве случаев мы можем применять метод
rawQuery(), который принимает два параметра: SQL-выражение SELECT и
дополнительный параметр, задающий параметры запроса.
После выполнения запроса rawQuery() возвращает объект Cursor, который
хранит результат выполнения SQL-запроса:
Cursor query = db.rawQuery("SELECT * FROM users;", null);
Класс Cursor предлагает ряд методов для управления выборкой, в частности:
getCount(): получает количество извлеченных из базы данных объектов
Методы moveToFirst() и moveToNext() позволяют переходить к первому и к
следующему элементам выборки. Метод isAfterLast() позволяет проверить,
достигнут ли конец выборки.
Методы get*(columnIndex) (например, getLong(), getString()) позволяют по
индексу столбца обратиться к данному столбцу текущей строки.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

170.

Класс CursorAdapter ч.1
Дополнительно для управления курсором в Android имеется класс
CursorAdapter. Он позволяет адаптировать полученный с помощью курсора набор
к отображению в списковых элементах наподобие ListView. Как правило, при
работе с курсором используется подкласс CursorAdapter - SimpleCursorAdapter.
userAdapter = new SimpleCursorAdapter(this, android.R.layout.two_line_list_item,
userCursor, headers, new int[]{android.R.id.text1, android.R.id.text2}, 0);
userList.setAdapter(userAdapter);
Конструктор класса SimpleCursorAdapter принимает шесть параметров:
Первым параметром выступает контекст, с которым ассоциируется адаптер,
например, текущая activity
Второй параметр - ресурс разметки интерфейса, который будет
использоваться для отображения результатов выборки
Третий параметр - курсор
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

171.

Класс CursorAdapter ч.2
Четвертый параметр - список столбцов из выборки, которые будут
отображаться в разметке интерфейса
Пятый параметр - элементы внутри ресурса разметки, которые будут
отображать значения столбцов из четвертого параметра
Шестой параметр - флаги, задающие поведения адаптера
При использовании CursorAdapter и его подклассов следует учитывать, что
выборка курсора должна включать целочисленный столбец с названием _id,
который должен быть уникальным для каждого элемента выборки. Значение
этого столбца при нажатии на элемент списка затем передается в метод
обработки onListItemClick(), благодаря чему мы можем по id
идентифицировать нажатый элемент.
Более подробно взаимодействие с БД будет рассмотрено в рамках ЛР№4
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

172.

Провайдеры контента
ОС Android хранит в базах данных разнообразную информацию, такую
как списки контактов, файлы сохраненных изображений и видеоматериалов,
отметки о звонках и т.д., то есть некоторый контент.
Для доступа к этому контенту в OC Android определены провайдеры
контента (content provider).
В Android имеются следующие встроенные провайдеры, определенные
в пакете android.content:
AlarmClock: управление будильником
Browser: история браузера и закладки
CalendarContract: календарь и информация о событиях
CallLog: информация о звонках
ContactsContract: контакты
MediaStore: медиа-файлы
SearchRecentSuggestions: подсказки по поиску
Settings: системные настройки
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

173.

Провайдеры контента. Работа с контактами
Контакты в Android обладают встроенным API, который позволяет
получать и изменять список контактов. Все контакты хранятся в базе данных
SQLite, однако они не представляют единой таблицы. Для контактов отведено
три таблицы, связанных отношением один-ко-многим: таблица для хранения
информации о людях, таблица их телефонов и и таблица адресов их
электронных почт. Но благодаря Android API мы можем абстрагироваться от
связей между таблицами.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

174.

Общая форма получения контактов
ArrayList<String> contacts = new ArrayList<String>();
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null,
null, null);
if(cursor!=null){
while (cursor.moveToNext()) {
// получаем каждый контакт
String contact =
cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));
// добавляем контакт в список
contacts.add(contact);
}
cursor.close();
}
Для получения контактов используется объект класса Cursor. Чтобы его получить, сначала
вызывается метод getContentResolver(), который возвращает объект ContentResolver. Затем по цепочке
вызывается метод query(). В этот метод передается ряд параметров, первый из которых представляет URI ресурс, который необходимо получить. Для обращения к базе данных контактов используется константа
ContactsContract.Contacts.CONTENT_URI
Метод contactsCursor.moveToNext() позволяет последовательно перемещаться по записям
контактов, считывая по одному контакту через вызов contactsCursor.getString().

175.

Разметка приложения для получения контактов
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Контакты">
</TextView>
<ListView
android:id="@+id/contactList"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</LinearLayout>
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

176.

Разрешения на работу с провайдерами контента
Главная сложность в работе с контактами и с любыми другими
провайдерами контента, заключается в установке разрешений.
До Android API 23 достаточно было установить соответствующее
разрешение в файле манифеста приложения.
Начиная с API 23 (Android Marshmallow) Google изменил схему работы
с разрешениями. Теперь пользователь сам должен решить, будет ли он давать
разрешения приложению. В связи с чем разработчики должны добавлять
дополнительный код.
Д доступа к контактам нам надо установить разрешение
android.permission.READ_CONTACTS в файле манифеста приложения перед
секцией <application>:
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

177.

Класс MainActivity
public class MainActivity extends AppCompatActivity {
//переменные для работы с разрешениями
private static final int REQUEST_CODE_READ_CONTACTS=1;
private static boolean READ_CONTACTS_GRANTED =false;
ListView contactList; //для отображения списка контактов
ArrayList<String> contacts = new ArrayList<String>(); //массив для адаптера ListView
@Override
protected void onCreate(Bundle savedInstanceState) {
... Метод onCreate приведен на следующем слайде
В начале класса определена переменная READ_CONTACTS_GRANTED,
которая будет использована для определения наличия разрешения.

178.

Переопределение onCreate в MainActivity ч.1
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contactList = (ListView) findViewById(R.id.contactList);
// получаем разрешения
int hasReadContactPermission = ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_CONTACTS);
// если устройство до API 23, устанавливаем разрешение
if(hasReadContactPermission == PackageManager.PERMISSION_GRANTED){
READ_CONTACTS_GRANTED = true;
}
else{
// вызываем диалоговое окно для установки разрешений
ActivityCompat.requestPermissions(this, new
String[]{Manifest.permission.READ_CONTACTS}, REQUEST_CODE_READ_CONTACTS);
}
// если разрешение установлено, загружаем контакты
if (READ_CONTACTS_GRANTED){
loadContacts();//загрузка контактов
}
}

179.

Переопределение onCreate в MainActivity ч.2
Для получения разрешений в вышеприведенном коде onCreate реализованы два
варианта действий.
Первый вариант предполагает, что устройство имеет версию Android ниже
Marshmallow (ниже API 23). Для этого мы просто узнаем, есть ли в манифесте разрешение
для READ_CONTACTS, и если оно есть, то устанавливаем для переменной
READ_CONTACTS_GRANTED значение true:
int hasReadContactPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS);
if(hasReadContactPermission == PackageManager.PERMISSION_GRANTED){
READ_CONTACTS_GRANTED = true;
}
Так как производится чтение разрешений в файле Manifest, потребуется
подключить соответствующую библиотеку:
import android.Manifest;

180.

Переопределение onCreate в MainActivity ч.3
Если версия Android API 23 или выше, необходимо отобразить диалоговое окно,
где пользователь решит, надо ли дать приложению разрешение:
// вызываем диалоговое окно для установки разрешений
ActivityCompat.requestPermissions(this, new
String[]{Manifest.permission.READ_CONTACTS}, REQUEST_CODE_READ_CONTACTS);
В этот метод передаются три параметра. Первый - текущий контекст, то есть
текущий объект Activity.
Второй параметр представляет набор разрешений, которые надо получить, в
виде массива строк. Нам надо получить в данном случае только одно разрешение Manifest.permission.READ_CONTACTS.
Третий параметр представляет код запроса, через который мы сможем получить
ответ пользователя.

181.

Переопределение метода получения разрешений ч.1
Чтобы получить выбор пользователя при установке разрешений, следует
переопределить в классе Activity метод onRequestPermissionsResult:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults){
switch (requestCode){
case REQUEST_CODE_READ_CONTACTS:
if(grantResults.length>0 && grantResults[0] ==
PackageManager.PERMISSION_GRANTED){
READ_CONTACTS_GRANTED = true;
}
}
if(READ_CONTACTS_GRANTED){
loadContacts();
}
else{
Toast.makeText(this, "Требуется установить разрешения",
Toast.LENGTH_LONG).show();
}
}

182.

Переопределение метода получения разрешений ч.2
В метод onRequestPermissionsResult передается три параметра.
Первый параметр метода requestCode - это тот код запроса, который
передавался в качестве третьего параметра в ActivityCompat.requestPermissions().
Второй параметр - массив строк, для которых устанавливались
разрешения. То есть одномоментно мы можем устанавливать сразу несколько
разрешений.
Третий параметр собственно хранит числовые коды разрешений. Так мы
запрашиваем только одно разрешение, то первый элемент массива будет хранить
его код. Через условное выражение мы можем проверить этот код:
grantResults[0] == PackageManager.PERMISSION_GRANTED.
И в зависимости от результата проверки изменить переменную
READ_CONTACTS_GRANTED.

183.

Переопределение метода получения разрешений ч.3
Загрузка контактов
private void loadContacts(){
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null,
null, null);
if(cursor!=null){
while (cursor.moveToNext()) {
// получаем каждый контакт
String contact = cursor.getString(
cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));
// добавляем контакт в список
contacts.add(contact);
.
}
cursor.close();
}
// создаем адаптер
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, contacts);
// устанавливаем для списка адаптер
contactList.setAdapter(adapter);
}

184.

Окно запроса разрешений
При запуске приложения на Android 6+ сначала отобразится окно для выдачи
разрешения, а после выдачи подтверждений список контактов:

185.

Публикация приложения
Работа с Github
Лекция 8
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

186.

.apk файл
После создания приложения, его тестирования и отладки мы можем
приступить к его публикации.
Суть публикации заключается в создании файла с расширением .apk,
который будет представлять приложение, и его последующем размещении в
Google Play Market или на других внешних сайтах.
APK (англ. Android Package) — формат архивных исполняемых файловприложений для Android. Каждое приложение Android скомпилировано и
упаковано в один файл, который включает в себя весь код приложения, ресурсы,
активы, файл манифеста AndroidManifest.xml и библиотеки.
Файл приложения может иметь любое имя, но расширение должно быть
.APK. Например: myAppFile.apk.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

187.

Настройка файла манифеста
По умолчанию в процессе отладки и создания приложения файл
apk уже создается, его можно найти в папке проекта по пути:
Название_проекта\app\build\outputs\apk.
По умолчанию файл называется app-debug.apk и представляет debugверсию.
Для полноценной публикации следует произвести подготовку проекта к
выпуску релиза. Для это следует в файле манифеста у элемента <manifest>
установить атрибуты android:versionCode и android:versionName. Также в файле
манифеста элемент <application> не должен содержать атрибута
android:debuggable.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package=«com.example.audioplayer"
android:versionName="1.0"
android:versionCode="1" >
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

188.

Настройка файла манифеста. Установка требований
На этапе подготовки к релизу также можно установить требования
к API. Так, приложение имеет определенную минимальную версию ОС Android,
поэтому можно установить в файле манифеста соответствующие атрибуты у
элемента <uses-sdk>
android:minSdkVersion — минимальная версия Android
android:targetSdkVersion — оптимальная версия API
android:maxSdkVersion — максимальная версия системы
Например, пусть минимальная версия - Jelly Beans 4.1.2, а оптимальная - KitKat
4.4.4:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="nam.example.audioplayer"
android:versionName="1.0"
android:versionCode="1" >
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="19" />
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

189.

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

190.

Создание сертификата
При создании сертификата следует помнить, что при обновлении
приложения система будет сравнивать сертификаты старой и новой версии.
Обновление будет происходить только в том случае, если сертификаты
обоих версий совпадут.
Если новая версия будет подписана новым сертификатом, то приложение
будет расцениваться как совершенно новое, никак не связанное со старой
версией и представляющее совершенно другое приложение. В этом случае,
чтобы его установить, новая версия должна будет иметь название пакета
отличное от старой.
Для создания сертификата следует выбрать в Android Studio пункт меню
Build -> Generate Signed Bundle(s)/APK. После этого откроется окно выбора
создания Bundle или APK
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

191.

Создание сертификата ч.2
Выберем APK и нажмем Next.
Откроется окно мастера создания
APK:
Если ключ для приложения не
создавался, следует нажать кнопку
Create new… и заполнить все поля
формы создания ключа.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

192.

Создание ключа
Допустимая длина пароля не менее 6
символов. Если все поля заполнены
корректно, после нажатия ОК отобразится
обновленное начальное окно.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

193.

Создание apk
Далее система предложит
выбрать вариант сборки – отладка
или релиз и по нажатии кнопки
Finish генерация apk будет
завершена. Созданный APK будет
расположен по пути:
ИмяПриложения\app\release\apprelease.apk
Файл можно переименовать сохранив его расширение и выложить в Play Market или
другой сайт или сразу загрузить на мобильное устройство. Следует учитывать, что если
приложение устанавливается не из Play Market, то в настройках надо разрешить установку из
других источников - Безопасность->Неизвестные источники (Разрешить установку приложений из
других источников).
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

194.

Публикация приложения в Play Market
Публикация приложения в Play
Market – наиболее эффективный способ
продвижения Вашего приложения.
Первым делом необходимо войти в
аккаунт Google Play Console по ссылке
https://play.google.com/apps/publish/signup/
В зависимости от того, имеется ли у
Вас аккаунт Google Play Console, следует
либо перейти в него, либо создать новый.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

195.

Создание аккаунта Google Play Console.
После создания аккаунта
Google Play Console Вам
будет предоставлен
возможность
ознакомиться с
соглашением
разработчика и списком
стран, где можно
распространять
приложение, а также
произвести оплату
регистрационного сбора
в 25 $.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

196.

Настройка профиля разработчика.
Для оплаты необходима
кредитная или дебетовая карта Visa /
MasterCard / AMEX / Discover.
После произведения оплаты
необходимо произвести настройку
профиля разработчика.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

197.

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

198.

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

199.

Работа с Github
Github представляет популярный
репозиторий проектов, который упрощает
ведение командной работы над одним проектом,
а также позволяет отслеживать все сделанные в
нем изменения.
Для работы прежде всего необходимо
создать учетную запись на сайте
https://github.com. Также для работы необходимо
установить инструментарий git, установщики
которого для различных ОС можно найти на
сайте https://git-scm.com/
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

200.

Работа с Github ч.2
После входа в аккаунт GitHub следует
выбрать Start a project и создать
репозиторий для проекта и выполнить
импорт кода.
Для этого в Android Studio
следует выбрать пункт меню VCS ->
Import into Version Control -> Share
Project on Github.
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

201.

Работа с Github ч.3
Войдите на сервер GitHub, указав Ваши логин
и пароль и выполните размещение проекта на
GitHub.
Для этого необходимо указать имя репозитория,
удаленное имя и описание.
Описание лучше писать на английском. После
ввода всех данных нажмем на кнопку Share.
После этого будет предложено указать те файлы
проекта, которые мы хотим закинуть на github:
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

202.

Работа с Github ч.4
После удачного экспорта файлов в Android
Studio отобразится соответствующее
сообщение.
Теперь проект расположен на GitHub.
Для внесения в него изменений в процессе
работыследует обновить проект в
репозитории. Для этого необходимо выбрать
пункту меню VCS -> Commit Changes....
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»

203.

Работа с Github ч.5
После этого отобразится окошко со
сделанными изменениями со времени
последнего коммита. В поле Commit Message
можно описать характер сделанных
изменений. Для завершения обновления
нажмем внизу окошка на кнопку Commit and
Push....
В появившемся окне надо подтвердить коммит.
Для этого нажмем на кнопку Push:
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Воронежский государственный технический университет»
English     Русский Правила