Программирование. Создание мобильных приложений на Android

Содержание

Слайд 2

OC Android – операционная система для мобильных телефонов, планшетов, компьютеров и

OC Android – операционная система для мобильных телефонов, планшетов, компьютеров и

т.д. на основе ядра Linux

ОС Android – это набор открытого программного обеспечения для мобильных устройств от компании Google, в состав которого входит операционная система и комплект базовых межплатформенных приложений
Android SDK – API для разработки мобильных приложений
Приложения для ОС Android являются программами в байт-коде для виртуальной машины Dalvik Virtual Machine, которая является частью мобильной платформы Android

Слайд 3

Варианты языков написания приложений для ОС Android Java - основной язык

Варианты языков написания приложений для ОС Android
Java - основной язык

для написания мобильных приложений
С# - возможный язык для написания с использованием Monodroid
Python - возможный язык для написания с использованием фреймворков Kivy или BeeWare Project.
Для компиляции приложений в формат .apk необходима ОС Linux или Mac
Слайд 4

Слайд 5

Особенности ВМ Dalvik каждое приложение запускается в своем собственном процессе со

Особенности ВМ Dalvik
каждое приложение запускается в своем собственном процессе со

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

System C library(libc) - стандартная системная библиотека Media Libraries – библиотеки

System C library(libc) - стандартная системная библиотека
Media Libraries – библиотеки для

работы с видео и
LibWebCore – встроенный веб браузер
Surface Manager – менеджер поверхностей
SGL (Scalable Graphics Library) – 2D графика
3D libraries – 3D графика
FreeType – шрифты
SQLite – БД
Слайд 7

Принцип многократного использования – любое приложение может использовать функциональные возможности другого

Принцип многократного использования – любое приложение может использовать функциональные возможности другого

приложения, если последнее откроет доступ на использование своей функциональности

Основа всех приложений:
менеджер действий (Activity Manager) – жизненный цикл приложения
контент-провайдеры (Content Providers) – доступ к данным других приложений
система представлений (View System) – построение внешнего вида приложений
менеджер ресурсов (Resource Manager) – доступ к строковым, графическим и другим типам ресурсов
менеджер извещений (Notification Manager) - позволяет любому приложению отображать пользовательские уведомления в строке статуса

Слайд 8

Базовые приложения: СМС Календарь Электронная почта Карты Браузер и т.д.

Базовые приложения:
СМС
Календарь
Электронная почта
Карты
Браузер
и т.д.

Слайд 9

Типы компонентов Activity – визуальный пользовательский интерфейс Service – компонент для

Типы компонентов
Activity – визуальный пользовательский интерфейс
Service – компонент для выполнения фоновых

задач без пользовательского интерфейса. Могут уведомлять пользователя через систему уведомлений
Intents – запрос функций из других служб
Broadcast Receiver – принимает системных сообщений и неявных intents
Content Provider – обмен данными между приложениями
Слайд 10

Песочница - отдельный пользователь со своими правами доступа и полномочиями. Каждое

Песочница -  отдельный пользователь со своими правами доступа и полномочиями. Каждое

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

Права доступа - привилегии, которые позволяют контролировать, какие именно возможности ОС будут доступны приложению.

Слайд 11

Ссылки .NET сборки Xamarin Метаданные .NET сборки Файлы для включения в

Ссылки
.NET сборки
Xamarin

Метаданные .NET сборки

Файлы для включения в пакет

Ресурсы приложения

Декларативный

UI

Ресурсы для
цветов
строк
стилей

.NET файлы

Слайд 12

Деятельность (Activity) Визуальный пользовательский интерфейс приложения Пример: окно приложения Обязательный Службы

Деятельность (Activity)
Визуальный пользовательский интерфейс приложения
Пример: окно приложения

Обязательный

Службы (Service)
Не имеет визуального интерфейса
Выполняется

в фоновом режиме

Не
обязательный

Приемник широковещательных намерений (Broadcast Receiver)
Не имеет визуального интерфейса
Компонент для получения внешних событий и реакций на них

Не
обязательный

Контент-провайдер (Content-Provider)
Компонент для создания набора данных, доступных для других приложений
Пример: CallLog, Settings

Не
обязательный

Слайд 13

Состояния Activity Активная (active или running) Приостановленная (paused) Остановленная (stopped) События

Состояния Activity

Активная
(active или running)

Приостановленная
(paused)

Остановленная
(stopped)

События Activity
OnCreate()
OnStart()
OnRestart()
OnResume()
OnPause()

OnStop()
OnDestroy()
Слайд 14

Компоновщик – объединение нескольких компонентов в одной группе Варианты компоновщиков (View

Компоновщик – объединение нескольких компонентов в одной группе

Варианты компоновщиков (View Group):
Relative

layout
Table Layout
Frame Layout
Linear Layout
Слайд 15

android:orientation="horizontal" android:orientation="vertical" Linear Layout – компоновка различных элементов один за одним

android:orientation="horizontal"

android:orientation="vertical"

Linear Layout – компоновка различных элементов один за одним последовательно. Компоновка

происходит либо вертикально, либо горизонтально в зависимости от параметра orientation
Слайд 16

Table Layout – расширенная компоновка LinearLayout. Выстраивает вложенные элементы в строки,

Table Layout – расширенная компоновка LinearLayout. Выстраивает вложенные элементы в строки,

и столбцы, как и в любой таблице. Рекомендуется при разработке приложений типа калькулятор

Table Layout состоит из TableRow , внутри которых можно размещать другие элементы и они будут выстраиваться горизонтально

Слайд 17

"1" Реализовать интерфейс, представленный на слайде. В качестве компоновщика использовать Table

"1" Реализовать интерфейс, представленный на слайде. В качестве компоновщика использовать Table

Layout
"2" Сделать так, что бы по нажатию на каждую кнопку, в текстовое поле добавлялось содержимое кнопки
Слайд 18

Ресурсы Цветовые #RGB #RRGGBB #ARGB #AARRGGBB Типовые Строковые Числовые (целые) Булевские

Ресурсы
Цветовые
#RGB
#RRGGBB
#ARGB
#AARRGGBB
Типовые
Строковые
Числовые (целые)
Булевские
Размеры
Массивы
Разметка (layout)
Меню
Рисуемые (drawable)
Изображения
Отрисовываемые цвета
Анимация
Стиль

Цвета - идентификатор кода, задающийся в 16-ом

коде
Адрес: resources/value/colors.xml
Типовые – типовые значения переменных
Адрес: resources/value/strings.xml или другие
Размеры – задаются в различных единицах – пиксели, дюймы, точки и т.д.
Адрес: resources/value/styles.xml (обычно)
Массивы – массивы типовых значений
Адрес: resources/value/array.xml (обычно)
Разметка – компоновщик
Адрес: resources/layout/activity_main.axml
Слайд 19

Слайд 20

string.xml Название приложения color.xml Основной цвет Основной цвет (темный) Цвет нижнего

string.xml
Название приложения

color.xml
Основной цвет
Основной цвет (темный)
Цвет нижнего бара
Задний фон приложения

style.xml
Название темы
Изначальная конфигурация

темы
Кастомизация темы
Слайд 21

string.xml Hello,World color.xml #ff6417 #ba4c14 #000000

string.xml
Hello,World

color.xml
#ff6417
#ba4c14

= “PrimaryColorText”>#000000
Слайд 22

Если параметры заданы в других файлах .xml, то обращение к ним

Если параметры заданы в других файлах .xml, то обращение к ним

происходит с использованием @ следующим образом:
@<название_папки>/<имя_строки>

Задание параметра стиля
”>@<название_папки>/<имя_строки>

Слайд 23

Итоговый файл со стилем Смена названия Label – текст в Primary

Итоговый файл со стилем

Смена названия

Label – текст в Primary
Theme – тема,

описываемая в style.xml
Слайд 24

Создание компонента = new (this); //this – аналог self в python

Создание компонента

<тип_компонента><имя_компонента> = new<тип_компонента>(this); //this – аналог self в python

Пример

создания кнопки

Button B = new Button(this);

Считывание строки из ресурсов

B.Text = Resources.GetString(Resource.<название_xml>.<имя_строки>);

Получение цвета из ресурсов

B.SetTextColor(Resources.GetColor(Resource.<название_xml>.<имя_цвета>);

Задание размера шрифта

B.SetTextSize(Android.Util.ComplexUnitType.Dip, 20);

Установка центра по центру или как необходимо

B.Gravity = GravityFlags.Center;

Считывание числа из ресурсов

int num = Resources.GetInt(Resource.<название_xml>.<имя_числа>);

Слайд 25

LinearLayout Main = new LinearLayout(this); Main.LayoutParameters = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MatchParent, LinearLayout.LayoutParams.MatchParent);

LinearLayout Main = new LinearLayout(this);
Main.LayoutParameters = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MatchParent,
LinearLayout.LayoutParams.MatchParent);

Создание компоновщика

Добавление в

компоновщик компонента

Main.AddView(B)

Установка компоновщика на форму

SetContentView(Main);

Слайд 26

"1" Создайте необходимые ресурсы (цвета, строки) для данного окна "2" Программным

"1" Создайте необходимые ресурсы (цвета, строки) для данного окна
"2" Программным способом

создайте компоновщик (в данном случае LinearLayout)
"3" Создайте 4 компонента TextView и заполните их

"5" Создайте две кнопки и одно текстовое поле с возможностью ввода (EditView). В поле можно вводить только целые положительные числа в диапазоне от 1 до 100. В случае, если введено больше 100, при работе программы снижать это значение до 100.
Сделать так, что бы соотношение высоты кнопок выставлялось в соответствии со значением, написанным в текстовом поле.
Допустим, написано 78, тогда нажатая кнопка должна занимать 78%, другая – 22%.

Слайд 27

Слайд 28

"1" Создать интерфейс, имитирующий вход в систему (логин, пароль, кнопка войти).

"1" Создать интерфейс, имитирующий вход в систему (логин, пароль, кнопка войти).

При неправильном вводе выводить сообщение что логин или пароль введены неверно.
"2" Осуществить переход из одного окна в другой
"3" Создать радиогруппу и текстовое поле, состоящую из трех кнопок: красный, зеленый, синий. По изменению состояния радиогруппы изменять текстовое поле по типу: выбран «название_цвета» цвет. Так же сделать так, что бы цвет текста изменялся в соответствии с выбранным элементом.
"4" Создать кнопку, предназначенную для выхода из приложения
Слайд 29

Данные Объект Адаптер Адаптер – мост, позволяющий соединить ресурсы (данные) с представлениями (объектами)

Данные

Объект

Адаптер

Адаптер – мост, позволяющий соединить ресурсы (данные) с представлениями (объектами)

Слайд 30

ArrayAdapter предназначен для работы с ListView. Данные представлены в виде массива,

ArrayAdapter предназначен для работы с ListView. Данные представлены в виде массива, которые

размещаются в отдельных элементах TextView

Опишите массив строк(чисел или др.) в ресурсах
Создайте компонент ListView в activity_main

Данные

Объект

Адаптер

Слайд 31

3. Создание разметки для списка 1) Создание отдельно xml файла в Layout 2) Описание разметки

3. Создание разметки для списка
1) Создание отдельно xml файла в Layout
2)

Описание разметки
Слайд 32

1. Считывание массива из ресурсов var countries = Resources.GetStringArray(Resource.Array.countries); 2. Поиск

1. Считывание массива из ресурсов

var countries = Resources.GetStringArray(Resource.Array.countries);

2. Поиск ListView по

Id

3. Создание адаптера, соединяющего компонент и данные

ListView LV = FindViewById(Resource.Id.LV);

ArrayAdapter A = new ArrayAdapter (this, Resource.Layout.list_item_1, countries);

4. Установка адаптера для компонента

LV.SetAdapter(A);

Слайд 33

"6" Создать интерфейс, в котором будет осуществляться выбор улицы, номера, дома из представленных списков.

"6" Создать интерфейс, в котором будет осуществляться выбор улицы, номера, дома

из представленных списков.
Слайд 34

Намерение (Intent) - это механизм для описания одной операции - выбрать

Намерение (Intent) - это механизм для описания одной операции - выбрать

фотографию, отправить письмо, сделать звонок, запустить браузер и перейти по указанному адресу.
Слайд 35

Intents Activity1 Activity2 + Открыть браузер Открыть галерею Открыть карту Явные (explicit) Неявные (implicit)

Intents

Activity1

Activity2
+
Открыть браузер
Открыть галерею
Открыть карту

Явные (explicit)

Неявные (implicit)

Слайд 36

Что указывается Адресат (какой компонент получит этот intent) Дополнительные данные, которые

Что указывается

Адресат (какой компонент получит этот intent)
Дополнительные данные, которые получит

адресат

Явные intent'ы определяют компонент для запуска по имени, в основном используется в своем собственном приложении.

Слайд 37

Слайд 38

Этапы задания: Создать еще одну активити Создать еще один файл типа

Этапы задания:
Создать еще одну активити
Создать еще один файл типа .cs (класс)
В

каждом из файлов прописать события нажатия кнопок с использованием интентов
Описать в манифесте какое из активити будет главным.
Слайд 39

Создание intent'а : Intent name = new intent(context, type); context –

Создание intent'а :

Intent name = new intent(context, type);
context – контекст текущего

состояния объекта (this)
type – тип intent'a
Пример:
Intent N = new intent(this, typeof(Activity);

Запуск активности:

StartActivity(name);

Слайд 40


Слайд 41

name.PutExtra(k, v); k – ключ, по которому потом можно будет считать

name.PutExtra(k, v);
k – ключ, по которому потом можно будет считать данные
v

– значение, которое передается

Intent next = new Intent(this,typeof(NewActivity)); next.PutExtra("log", 123); StartActivity(next);

string str = Intent.GetStringExtra(k);
k - ключ

string N = Intent.GetStringExtra("123"); B2.Click+= delegate(object sender, EventArgs args) { B2.Text = N; };

Слайд 42

Создать приложение, в котором на первом экране вводится какой-либо текст, а

Создать приложение, в котором на первом экране вводится какой-либо текст, а

на другом экране будет отображаться зашифрованный текст. Шифрование текста реализовать с помощью:
«3» - шифра Цезаря
«4» - Азбуки Морзе
«На дом» - Создать генератор мемов (2 строки для ввода, 2 строки для генерирования и загрузки картинки на первом активити). На втором – сгенерированный мем.
Слайд 43

Неявные intent'ы не дают определенные целевые компоненты, но включает достаточно информации

Неявные intent'ы не дают определенные целевые компоненты, но включает достаточно информации

для системы чтобы определить, какой настоящий компонент подходит для запуска этого намерения.
В неявные intent’ы передаются:
Action – действия
Data – данные
Category – при каких обстоятельствах обслуживается действие
Слайд 44

Примеры работы с неявными intent’ами Позвонить Отправить смс Открыть ссылку в браузере Написать на e-mail

Примеры работы с неявными intent’ами
Позвонить
Отправить смс
Открыть ссылку в браузере
Написать на e-mail

Слайд 45

Для открытия ссылки в браузере необходимо иметь ссылку (data) и определиться с действием.

Для открытия ссылки в браузере необходимо иметь ссылку (data) и определиться

с действием.
Слайд 46

string URL = "http://google.com"; Intent GoToTheGoogle = new Intent(Intent.ActionView, Uri.Parse(URL)); StartActivity(go_to_google);

string URL = "http://google.com"; Intent GoToTheGoogle = new Intent(Intent.ActionView, Uri.Parse(URL)); StartActivity(go_to_google);

Конструктор Intent содержит

2 передаваемых параметра:
Тип действия
Данные, которые нужно обработать
Слайд 47

string number = "tel:89627900043"; Intent call = new Intent(Intent.ActionView, Uri.Parse(number)); StartActivity(call);

string number = "tel:89627900043"; Intent call = new Intent(Intent.ActionView, Uri.Parse(number)); StartActivity(call);

Звонок

Смс

Intent smsIntent =

new Intent(Intent.ActionSendto, Uri.Parse("smsto:89627900043")); smsIntent.PutExtra("sms_body", "Some SMS text"); StartActivity(smsIntent);

Задание: Создать телефонную книгу с:
возможностью отправлять сообщения и осуществлять звонки
добавлять и удалять контакты

Слайд 48

1. Создается файл xml в отдельной папке с ресурсами, в котором

1. Создается файл xml в отдельной папке с ресурсами, в котором

прописываются составляющие меню

Item – отдельный компонент меню

Слайд 49

Перезаписываются функции для: Создания меню Выполнение каких либо действий по нажатию

Перезаписываются функции для:
Создания меню
Выполнение каких либо действий по нажатию на элемент

меню

public override bool OnCreateOptionsMenu(IMenu menu) { MenuInflater.Inflate(Resource.Menu.MainMenu, menu); return base.OnCreateOptionsMenu(menu);
}

public override bool OnOptionsItemSelected(IMenuItem item) { switch (item.ItemId) { case Resource.Id.item1: Toast.MakeText(Application.Context, "item1 is selected", ToastLength.Short).Show(); break; case Resource.Id.item2: Toast.MakeText(Application.Context, "item2 is selected", ToastLength.Short).Show(); break; } return base.OnOptionsItemSelected(item);
}

Слайд 50

public override bool OnCreateOptionsMenu(IMenu menu) { MenuInflater.Inflate(Resource.Menu.MainMenu, menu); return base.OnCreateOptionsMenu(menu); }


public override bool OnCreateOptionsMenu(IMenu menu) { MenuInflater.Inflate(Resource.Menu.MainMenu, menu); return base.OnCreateOptionsMenu(menu);
}

MenuInflater.Inflater – наполнение

передаваемого элемента menu контентом, хранящемся в xml файле MainMenu
Слайд 51

public override bool OnOptionsItemSelected(IMenuItem item) { switch (item.ItemId) { case Resource.Id.item1:

public override bool OnOptionsItemSelected(IMenuItem item) { switch (item.ItemId) { case Resource.Id.item1: Toast.MakeText(Application.Context,

"item1 is selected", ToastLength.Short).Show(); break; case Resource.Id.item2: Toast.MakeText(Application.Context, "item2 is selected", ToastLength.Short).Show(); break; } return base.OnOptionsItemSelected(item); }

switch – оператор множественного выбора. Выбирает один из предложенных в его теле case-ов.
В данном случае идет поиск по Id item-ов меню
Toast.MakeText – всплывающее сообщение

Слайд 52

android:id = "@+id/item3" android:title="item3">
Слайд 53

Задание: Доработать телефонную книгу Создать меню, в котором будут находиться кнопки

Задание: Доработать телефонную книгу
Создать меню, в котором будут находиться кнопки для

создания и удаления контакта
Осуществить возможность поиска по контактам
Слайд 54

Контекстное меню вызывается длительным нажатием на каком-либо экранном компоненте. Создайте 2

Контекстное меню вызывается длительным нажатием на каком-либо экранном компоненте.

Создайте 2

TextView, в которых будет задаваться цвет и размер текста
В функции onCreate опишите их и зарегистрируйте их для контекстного меню

T[0] = FindViewById(Resource.Id.T1); RegisterForContextMenu(T[0]);

Слайд 55

Функции для работы с контекстным меню: OnCreateContextMenu(IContextMenu menu, View v, IContextMenuContextMenuInfo

Функции для работы с контекстным меню:
OnCreateContextMenu(IContextMenu menu, View v, IContextMenuContextMenuInfo menuInfo);
IContextMenu

– переменная для контекстного меню
View – объект, для которого будет вызываться контекстное меню
IContextMenuContextMenuInfo – доп. информация
OnContextItemSelected(IMenuItem item);
IMenuItem – Элемент меню
Слайд 56

public override void OnCreateContextMenu(IContextMenu menu, View v, IContextMenuContextMenuInfo menuInfo) { base.OnCreateContextMenu(menu,

public override void OnCreateContextMenu(IContextMenu menu, View v,
IContextMenuContextMenuInfo menuInfo) { base.OnCreateContextMenu(menu, v,

menuInfo); switch (v.Id) { case Resource.Id.T1: menu.Add(0, 1, 0, "Red"); menu.Add(0, 2, 0, "Green"); menu.Add(0, 3, 0, "Blue"); break; case Resource.Id.T2: menu.Add(0, 4, 0, "10"); menu.Add(0, 5, 0, "14"); menu.Add(0, 6, 0, "18"); break; } }

menu.Add(groupId, itemId, order, title)

OnCreateContextMenu – функция, отвечающая за создание контекстного меню компонентов

Слайд 57

SetTextColor(Color) – установка цвета текста SetTextSize (Type, Size) – установка размера

SetTextColor(Color) – установка цвета текста
SetTextSize (Type, Size) – установка размера шрифта
Type

– тип величины (ComplexUnitType.Dip - dp)

OnContextItemSelected – функция, отвечающая за выбор элемента контекстного меню

public override bool OnContextItemSelected(IMenuItem item) { switch (item.ItemId){ case 1: for (int i = 0; i < T.Length; i++) { T[i].SetTextColor(Color.Red); } case 4: for (int i = 0; i < T.Length; i++){ T[i].SetTextSize(ComplexUnitType.Dip,10); } } return base.OnContextItemSelected(item); }

Слайд 58

Задание: Доработать телефонную книгу Дополнить меню элементом настройки В окно настроек

Задание: Доработать телефонную книгу
Дополнить меню элементом настройки
В окно настроек добавить следующие

параметры:
размер шрифта
цвет шрифта
формат вывода телефона
3) Для каждого из элемента настроек реализовать контекстное меню
4) Проверить итоговую функциональность телефонной книги
Слайд 59

Хранение данных в android осуществляется тремя способами: Preferences – хранение небольшого

Хранение данных в android осуществляется тремя способами:
Preferences – хранение небольшого количества

данных в самом приложении
SQLite – базы данных, таблицы
Файлы – во внутренней и внешней (SD-карты) памяти телефона
Слайд 60

ISharedPreferences – постоянное хранилище на платформе andorid ISharedPreferences sPref; //Получение доступа

ISharedPreferences – постоянное хранилище на платформе andorid
ISharedPreferences sPref;
//Получение доступа к хранилищу
sPref

= GetPreferences(FileCreationMode.Private);

Для записи данных в хранилище необходимо создать Editor
Editor – объект, предназначенный для каких-либо изменений в хранилище приложения

ISharedPreferencesEditor editor = sPref.Edit();
//Обновление editor-a
editor.Apply();

Слайд 61

Preference хранит данные в виде пары – ключ, значение Метод записи

Preference хранит данные в виде пары – ключ, значение

Метод записи данных

editor.PutString("savedText",

L.Text.ToString())

ключ значение

PutInt
PutBoolean
PutFloat
PutLong

Метод чтения данных

sPref.GetString("savedText", "" );

ключ дефолтное значение

Слайд 62

Написать программу, позволяющую записывать информацию из editText в хранилище и считывать

Написать программу, позволяющую записывать информацию из editText в хранилище и считывать

ее оттуда

1. Создать объект, описывающий хранилище в приложении

ISharedPreferences sPref;

2. Создать события нажатия на кнопку для считывания и записи информации в хранилище

Слайд 63

In.Click += delegate(object sender, EventArgs args) { sPref = GetPreferences(FileCreationMode.Private); ISharedPreferencesEditor

In.Click += delegate(object sender, EventArgs args) {
sPref = GetPreferences(FileCreationMode.Private);
ISharedPreferencesEditor editor

= sPref.Edit();
editor.PutString("savedText", L.Text.ToString());
editor.Apply();
Toast.MakeText(Application.Context, "Текст записан",
ToastLength.Short).Show();
Слайд 64

Out.Click += delegate(object sender, EventArgs args) { sPref = GetPreferences(FileCreationMode.Private); string

Out.Click += delegate(object sender, EventArgs args) {
sPref = GetPreferences(FileCreationMode.Private);
string getText

= sPref.GetString("savedText","");
L.Text = getText;
Toast.MakeText(Application.Context, "Текст считан", ToastLength.Long).Show();
};
Слайд 65

private Button In, Out; private EditText L; private ISharedPreferences sPref; protected

private Button In, Out;
private EditText L;
private ISharedPreferences sPref;

protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_main);
In = FindViewById