Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

PMS-Lab4 / lab4

.docx
Скачиваний:
23
Добавлен:
18.02.2023
Размер:
210.72 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

Учреждение образования «Полоцкий государственный университет»

Факультет информационных технологий Кафедра технологий программирования

ЛАБОРАТОРНАЯ РАБОТА №4

по дисциплине: «Программирование мобильных систем»

на тему: «Вызов Активности с помощью явного намерения и получение результатов работы. Использование неявных Намерений. Получение данных из Намерения»

ВЫПОЛНИЛ студент группы

ПРОВЕРИЛ

Полоцк

Цель: научиться вызывать активность с использованием явного намерения и получать результаты её работы. Научиться использовать неявные намерения и получать данные из намерения.

Краткие теоретические сведения:

Намерения (Intent) в Android используются в качестве механизма передачи сообщений, который может работать как внутри одного приложения, так и между приложениями.

Намерения могут применяться для:

– объявления о желании (необходимости) вашего приложения запуска какой-то Активности или Сервиса для выполнения определенных действий;

– извещения о том, что произошло какое-то событие;

– явного запуска указанного Сервиса или Активности.

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

Чтобы запустить нужную Активность, вызывается метод startActivity(someIntent).

В конструкторе Намерения можно явно указать класс Активности, которую требуется запустить, или действие, которое нужно выполнить. Во втором случае система автоматически подберет нужную Активность, используя механизм, называемый Определением Намерений (Intent Resolution). Метод startActivity находит запускает Активность, наиболее подходящую вашему Намерению.

По окончании работы запущенной таким образом Активности запустившая ее Активность не получает никаких извещений о результатах обработки Намерения. Если требуется получать результаты, используется метод startActivityForResult.

Для явного указания того, какую Активность (конкретный класс в приложении) требуется запустить, создаются Намерения с помощью указания параметров следующих конструктора: текущий Контекст приложения и класс Активности для запуска.

Активность, запущенная с помощью метода startActivity, полностью независима от запустившей ее Активности и, соответственно, завершает свою работу, никому об этом не сообщая. В то же время, вы можете запускать Активности, «связанные» со своим «породителем». Такой способ отлично подходит для ситуаций, когда «дочерняя» Активность должна обработать ввод пользовательских данных и предоставить результаты обработки «родительской» Активности. Запускаемые таким образом (с помощью метода startActivityForResult) Активности должны быть «зарегистрированы» в Манифесте приложения.

В отличие от метода startActivity, метод startActivityForResult требует явного указания еще одного параметра – кода запроса (request code). Этот параметр используется вызывающей Активностью для определения того, какая именно дочерняя Активность завершила работу и (возможно) предоставила результаты.

Когда дочерняя Активность готова к завершению работы, до вызова метода finish требуется вызвать метод setResult для передачи результатов вызывающей Активности.

Метод setResult получает два параметра: код возврата и сам результат, представленный в виде Намерения.

Код возврата (result code), возвращаемый из дочерней Активности – это, обычно, либо Activity.RESULT_OK, либо Activity.RESULT_CANCELED. В случае, если дочерняя Активность завершит работу без вызова метода setResult, код возврата, переданный родительской Активности, будет равен Activity.RESULT_CANCELED.

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

Намерение, возвращаемое как результат, часто содержит URI, указывающий на конкретный объект данных, и/или набор дополнительных значений, записанных в свойство Намерения extras, использующихся для передачи дополнительной информации.

Когда дочерняя Активность завершает работу, в родительской Активности вызывается обработчик onActivityResult, который получает следующие параметры:

– Request code. Использованный при запуске дочерней активности код запроса;

– Result code. Код возврата;

– Data. Намерение, используемое для упаковки возвращаемых данных.

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

При создании Намерения, которое в дальнейшем будет передано методу startActivity, необходимо назначить действие (action), которое нужно выполнить, и, возможно, указать URI данных, которые нужно обработать. Также можно передать дополнительную информацию с помощью свойства extras Намерения. Android сам найдет подходящую Активность (основываясь на характеристиках Намерения) и запустит ее.

Для определения того, какой именно компонент должен быть запущен для выполнения действий, указанных в Намерениях, Android использует Фильтры Намерений (Intent Filters). Используя Фильтры Намерений, приложения сообщают системе, что они могут выполнять определенные действия (action) с определенными данными (data) при определенных условиях (category) по заказу других компонентов системы.

Для регистрации компонента приложения (Активности или Сервиса) в качестве потенциального обработчика Намерений, требуется добавить элемент <intent-filter> в качестве дочернего элемента для нужного компонента в Манифесте приложения. У элемента <intent-filter> могут быть указаны следующие дочерние элементы (и соответствующие атрибуты у них):

<action>. Атрибут android:name данного элемента используется для указания названия действия, которое может обслуживаться. Каждый Фильтр Намерений должен содержать не менее одного вложенного элемента <action>. Если не указать действие, ни одно Намерение не будет «проходить» через этот Фильтр. У главной Активности приложения в Манифесте должен быть указан Фильтр Намерений с действием android.intent.action.MAIN

<category>. Сообщает системе, при каких обстоятельствах должно обслуживаться действие (с помощью атрибута android:name). Внутри <intent-filter> может быть указано несколько категорий. Категория android.intent.category.LAUNCHER требуется Активности, которая желает иметь «иконку» для запуска. Активности, запускаемые с помощью метода startActivity, обязаны иметь категорию android.intent.category.DEFAULT

<data>. Дает возможность указать тип данных, которые может обрабатывать компонент. <intent-filter> может содержать несколько элементов <data>. В этом элементе могут использоваться следующие атрибуты:

– android:host : имя хоста (например, www.specialist.ru)

– android:mimetype : обрабатываемый тип данных (например, text/html)

– android:path : «путь» внутри URI (например, /course/android)

– android:port : порт сервера (например, 80)

– android:scheme : схема URI (например, http)

При запуске Активности с помощью метода startActivity неявное Намерение обычно подходит только одной Активности. Если для данного Намерения подходят несколько Активностей, пользователю предлагается список вариантов.

Определение того, какие Активности подходят для Намерения, называется Intent Resolution. Его задача – определить наиболее подходящие Фильтры Намерений, принадлежащие компонентам установленных приложений.

Поскольку объекты типа Intent служат, в том числе, для передачи информации между компонентами одного или нескольких приложений, может возникнуть необходимость в работе с объектом Намерения, вызвавшим Активность к жизни. Для получения доступа к этому объекту используется метод getIntent.

Имея данный объект, можно получить доступ к информации, содержащейся в нем:

– метод getAction возвращает действие Намерения

– метод getData возвращает данные Намерения (обычно URI)

– набор методов для разных типов вида getТИПExtra позволяет получить доступ к типизированным значениям, хранящимся в свойстве extras Намерения.

Описание проделанной работы:

1. Создать новый проект MetroPicker.

2. Добавить вспомогательную Активность ListViewActivity для отображения и выбора станций метро, в качестве заготовки используйте результаты лабораторной работы «Использование ListView» .

3. Отредактировать файл разметки res/layout/main.xml: добавить кнопку выбора станции метро, присвоив идентификаторы виджетам TextView и Button для того, чтобы на них можно было ссылаться в коде.

4. Установить обработчик нажатия на кнопку в главной Активности для вызова списка станции и выбора нужной станции.

5. Написать нужный обработчик для установки выбранной станции метро в виджет TextView родительской Активности (метод setText виджета TextView позволяет установить отображаемый текст). А также обработать ситуацию, когда пользователь нажимает кнопку «Назад» (в этом случае «никакой станции не выбрано» и главная Активность должна известить об этом пользователя).

6. Протестировать созданное приложение, проверив реакцию на различные действия потенциальных пользователей.

7. Изменить проект MetroPicker так, чтобы для запуска Активности ListViewActivity использовалось неявное Намерение с действием (action), определенным в приложении и имеющем значение "com.example.metropicker.intent.action.PICK_METRO_STATION".

8. Модифицировать методы onCreate Активностей так, чтобы с помощью Toast они показывали действие вызвавшего их Намерения.

Вывод: научились вызывать активность с использованием явного намерения и получать результаты её работы. Научились использовать неявные намерения и получать данные из намерения.