Телефонуйте » (+38) 096 227 41 41

Однією з найбільш важливих можливостей Android є здатність додатків відправляти користувача в інший додаток на основі «дії», яку той хотів би виконати. Наприклад, щоб з вашого додатка переглянути адресу на карті досить створити запит на перегляд адреси, використовуючи Intent, а система Android запустить інший додаток, який покаже адресу на карті.

Як пояснювалось в першому уроці про створення свого першого додатка, ви повинні використовувати intents (наміри) для навігації між activity у власному додатку. Ви, зазвичай, робите це з explicit intent (явним наміром), який визначає точне ім'я класу компонента, який хочете запустити. Тим не менше, якщо хочете, щоб окремий додаток виконав дію, наприклад, "переглянув карту", то повинні використати неявний намір.
В цьому уроці покажемо, як створити неявний намір для конкретної дії і як використати його, щоб запустити activity, яка виконає дію в іншому додатку.

Побудова неявного наміру (Implicit Intent)

Неявні наміри не оголошують ім'я класу компонента, щоб його запустити, а замість цього оголошують виконувану дію. Дія визначає, що ви хочете зробити, наприклад, переглянути, редагувати, відправити чи отримати щось. Наміри також часто включають в себе пов'язані з дією дані, такі як адресу, яку хочете переглянути, або повідомлення електронної пошти, яке хочете відправити. Залежно від наміру, який хочете створити, дані можуть бути Uri, один з декількох інших типів даних, або наміру зовсім не потрібно дані.
Якщо ваші дані Uri, то є простий конструктор Intent(), який можна використати для визначення дії і даних.
Приклад, як створити намір ініціювати телефонний дзвінок, використовуючи дані Uri, щоб вказати номер телефону:

Uri number = Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);

Коли ваш додаток спричинює цей намір, викликаючи startActivity(), додаток Phone ініціює виклик даного номеру телефону.
Ось кілька інших намірів, їх дія та пари Uri і даних:

• Переглянути карту:

// Точка на карті на основі адреси
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
// Або точка на карті на основі широти/довготи
// Uri location = Uri.parse("geo:37.422219,-122.08364?z=14");
// Параметром є рівень масштабування
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

• Перегляд веб-сторінки:

Uri webpage = Uri.parse("http://www.android.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);

Інші види неявних намірів вимагають "extra" (додаткових) даних, які надають різні типи даних, наприклад, таких як рядки. Ви можете додати одну або більше частин додаткових даних, використовуючи різні методи putExtra().
За замовчуванням, система визначає відповідний тип MIME, який необхідний наміру, на основі включених в Uri даних. Якщо ви не включили Uri в намір, то повинні, як правило, використовувати setType(), щоб вказати тип даних, пов'язаних з наміром. Установка типу MIME далі визначає, які види activity повинні отримати намір.
Приклади ще кількох намірів, які вимагають "extra" дані, щоб визначити необхідну дію:

• Надіслати електронну пошту з додатком:

Intent emailIntent = new Intent(Intent.ACTION_SEND);
// Намір не має URI, тому оголошуємо тип MIME "text/plain"
emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"This email address is being protected from spambots. You need JavaScript enabled to view it."}); // Одержувачі
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text");
emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://шлях/до/email/прикріплення"));
// Також можете прикріпити декілька елементів, передаючи ArrayList з Uris

• Створити подію в календарі:

Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30);
Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30);
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
calendarIntent.putExtra(Events.TITLE, "Ninja class");
calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");

Примітка: Цей намір для події в календарі підтримується тільки з рівнем API 14 і вище.

Примітка: Важливо, щоб ви визначили свій Intent як можна більш конкретніше. Наприклад, якщо хочете показати зображення, використовуючи намір ACTION_VIEW, то повинні вказати тип MIME image/*. Це запобігає запуску наміром додатків, які можуть "переглядати", та інших типів даних (наприклад, додаток карти).

Перевірка, чи існує додаток для отримання Intent

Хоча Android-платформа гарантує, що деякі наміри буде вирішувати один з вбудованих додатків (наприклад, додатки Phone, Email чи Calendar), ви завжди повинні включати крок перевірки перед викликом наміру.

Увага: Якщо викликаєте намір і немає додатка на пристрої, який може обробити цей намір, то ваш додаток завалиться.

Щоб перевірити чи є доступні activity, які можуть реагувати на намір, викликаєте queryIntentActivities(), щоб отримати перелік activity, здатних обробляти ваш Intent. Якщо повернутий List не порожній, то можете сміливо використовувати намір. Наприклад:

PackageManager packageManager = getPackageManager();
List activities = packageManager.queryIntentActivities(intent,
        PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = activities.size() > 0;

Якщо isIntentSafe рівне true, то, принаймні один додаток буде реагувати на намір. Якщо false, то немає жодного додатку для обробки наміру.


Примітка: Ви повинні виконати цю перевірку, коли ваша activity запускається вперше, бо в разі необхідності вам треба відключити функцію, яка використовує наміри, перш ніж користувач буде намагатися використати її. Якщо ви знаєте конкретний додаток, який може обробляти намір, то можете також надати посилання для користувача, щоб завантажити додаток.

Запуск Activity з Intent

Приклад діалогу вибору, який з'являється, коли більше одного додатка може обробляти намір.

Після того, як ви створили свій Intent і встановили додаткову інформацію, викликайте startActivity(), щоб відправити його в систему. Якщо система визначає більше однієї activity, яка може обробляти намір, то відображає користувачу діалогове вікно, щоб він вибрав додаток, який використовувати, як показано на малюнку вище. Якщо є лише одна activity, яка обробляє намір, то система негайно запускає її.

startActivity(intent);

Нижче наведений повний приклад, який показує, як створити намір, щоб подивитися карту, переконатися, що існує додаток для обробки наміру, а потім запустити його:

// Створення наміру
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

// Перевірка, чи є додаток для обробки
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
boolean isIntentSafe = activities.size() > 0;

// Запуск activity, якщо збережено
if (isIntentSafe) {
    startActivity(mapIntent);
}

Відображення вибору додатку


Діалог вибору.

Зверніть увагу, що коли ви запускаєте activity, передаючи свій Intent в startActivity(), і є більш ніж один додаток, який реагує на намір, то користувач може вибрати, які програми використовувати за замовчуванням (вибравши прапорець в нижній частині діалогового вікна). Це приємно, коли виконується дія, для якої користувач, як правило, хоче використовувати той же додаток щоразу, наприклад, при відкритті веб-сторінки (користувачі, ймовірно, використовують тільки один веб-браузер) або приймаючи фото (користувачі, ймовірно, мають одну камеру).
Однак, якщо дія, що виконується, може бути оброблена декількома додатками і користувач може віддавати перевагу різним додаткам кожен раз, - такі «розшарені» дії, для яких користувачі можуть мати кілька додатків, через які вони могли б поділитися елементом - ви повинні явно показувати діалог вибору, як на малюнку вище. Діалог вибору змушує користувача щоразу вибирати додаток, який використовувати для дії (користувач не може вибрати додаток для дії за замовчуванням).
Щоб показати вибір, створіть Intent, використовуючи createChooser() і передайте його в startActivity(). Наприклад:

Intent intent = new Intent(Intent.ACTION_SEND);
...

// Завжди використовуйте рядкові ресурси для тексту UI.
// Це говорить щось на кшталт "Поділитися цим фото з"
String title = getResources().getString(R.string.chooser_title);
// Створюємо намір, щоб показати вибір
Intent chooser = Intent.createChooser(intent, title);

// Перевіряємо, що намір буде вирішуватися, принаймні, однією activity
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}

Буде виведене діалогове вікно зі списком додатків, які відповідають на намір, переданий в метод createChooser(), що використовує прикладений текст як заголовок діалогу.
(Джерело: developer.android.com)

Новини

  • SDR в IoT

    iotSDR пропонує платформу розробок для IoT-радіо та мережевих доменів. На платі два передавачі Microchip AT86RF215, для вводу-виводу модему на Xilinx ZYNQ SoC, приймач GNSS MAX2769 для GPS, Galileo, BieDou та Glonass. Плата сумісна з ПЗ GNURadio SDR. Дозволяє розробити протоколи фізичного рівня LoRa, SigFox, WightLess, Bluetooth, BLE, 802.15.4, ZigBee тощо для IoT, або шлюз IoT через TheThingsNetwork, LPWAN або Google Thread. Пам'ять EEPROM: 1x AT24MAC602 , flash-пам'ять: 1x QSPI 128 Мб, RAM: 256 MБ DDR3,слот для Micro SD карти, входи/виходи: 2x 8-бітних інтерфейси PL, інтерфейс 8-бітного PS, Gigabit Ethernet, USB 2.0 (USB3310), USB 2.0 (CP2104), 2x SMA RF-роз'єми для приймача діапазонів IoT, 2x SMA RF-роз'єми для приймача 2,4 ГГц , RF-роз'єм приймач GNSS, FPGA-роз'єм JTAG для програмування. Розміри плати: 76,2 мм x 101,6 мм.

     

    in Новини

Записатися на курс