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

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

Наприклад, якщо будуєте соціальний додаток, який може ділитися повідомленнями або фотографіями з друзями-користувачами, то у ваших інтересах підтримати намір ACTION_SEND, щоб користувачі могли ініціювати дію "share" з іншого додатку і запустити ваш додаток для виконання дії.
Щоб інші додатки могли запустили вашу activity, необхідно додати елемент <intent-filter> у файл маніфесту для відповідного елемента <activity>.
Коли ваш додаток встановлюється на пристрої, система ідентифікує фільтри наміру і додає інформацію на внутрішній каталог намірів, підтримуваних всіма встановленими додатками. Коли додаток викликає startActivity() або startActivityForResult() з неявною метою, система знаходить яка (або які) activity можуть реагувати на наміри.

Додавання фільтра Intent

Для того, щоб правильно визначити, які наміри ваша activity може обробляти, кожен доданий вами фільтр наміру повинен бути якомога більш конкретним з точки зору типу дій і даних, які приймає activity.
Система може відправити дані Intent до activity, якщо ця activity має фільтр наміру, що відповідає певним критеріям об'єкта Intent:

Action (Дія)

Рядок з ім'ям дії, яка виконується. Зазвичай, одне зі значень платформи визначається як ACTION_SEND або ACTION_VIEW.
Вкажіть це у своєму фільтрі наміру з елементом <action>. Значення, вказане в цьому елементі, повинне бути повним  рядковим ім'ям для дії, а не константою API (див. приклади нижче).

Data (Дані)

Опис даних, пов'язаних з наміром.
Вкажіть це у своєму фільтрі наміру з елементом <data>. Використанням одного або декількох атрибутів в цьому елементі, ви можете вказати тільки тип MIME, просто префікс URI, тільки схему URI, або поєднати ці та інші значення, які вказують на тип прийнятих даних.
Примітка: Якщо вам не потрібно оголошувати специфіку даних URI (наприклад, коли ваша activity обробляє інші види «extra» даних, а не URI), то повинні вказати тільки атрибут android:mimeType, щоб оголосити тип даних, які обробляє ваша activity, таких як text/plain або image/jpeg.

Category (Категорія)

Забезпечує додатковий спосіб охарактеризувати обробку наміру activity, як правило, пов'язану з жестом користувача або місцем, з якого він стартував. Є кілька різних категорій, підтримуваних системою, але більшість з них використовується не часто. Тим не менше, всі неявні наміри визначаються з CATEGORY_DEFAULT за замовчуванням.
Вкажіть це у своєму фільтрі наміру з елементом <category>.

У своєму фільтрі наміру можете оголосити, які критерії ваша activity приймає, оголосивши кожен з них з відповідними XML-елементів, вкладених в елемент <intent-filter>
Приклад activity з фільтром наміру, який обробляє намір ACTION_SEND, коли типом даних є або текст, або зображення:

<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
        <data android:mimeType="image/*"/>
    </intent-filter>
</activity>

Кожний вхідний намір визначає тільки одну дію і один тип даних, але це нормально, щоб оголосити кілька примірників елементів <action>, <category> і <data> в кожному <intent-filter>.
Якщо будь-які дві пари дій і даних є взаємовиключними в своїй поведінці, то треба створити окремі фільтри намірів, щоб вказати, які дії є прийнятними, коли паруються, з якими типами даних.
Наприклад, припустимо, що ваша activity обробляє текст і зображення для обох намірів ACTION_SEND і ACTION_SENDTO. У цьому випадку, ви повинні визначити два окремих фільтри намірів для двох дій, тому що намір ACTION_SENDTO повинен використовувати дані Uri, щоб вказати адресу одержувача, використовуючи send або sendto схеми URI. Наприклад:

<activity android:name="ShareActivity">
    <!-- filter for sending text; accepts SENDTO action with sms URI schemes -->
    <intent-filter>
        <action android:name="android.intent.action.SENDTO"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="sms" />
        <data android:scheme="smsto" />
    </intent-filter>
    <!-- filter for sending text or images; accepts SEND action and text or image data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="image/*"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

Примітка: Для того, щоб отримати неявні наміри, ви повинні включити категорію CATEGORY_DEFAULT у фільтр наміру. Методи startActivity() і startActivityForResult() розглядають всі наміри так, як ніби вони оголосили категорію CATEGORY_DEFAULT. Якщо ви не оголошували її у фільтрі наміру, то неявні наміри не запустять вашу activity.

Поведінка Intent у вашій Activity

Для того, щоб вирішити, які дії слід прийняти у вашій activity, ви можете прочитати Intent, який був використаний для запуску activity.
Як тільки запустилась ваша activity, викликайте getIntent(), щоб отримати Intent, який стартував activity. Ви можете зробити це в будь-який час протягом всього життєвого циклу activity, але повинні зробити це, як правило, під час таких ранніх зворотних викликів, як onCreate() або onStart().
Наприклад:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    // Отримати намір, який запустив дану activity
    Intent intent = getIntent();
    Uri data = intent.getData();

    // З'ясувати, що ж робити, грунтуючись на типі наміру
    if (intent.getType().indexOf("image/") != -1) {
        // Обробка наміру з даними зображення ...
    } else if (intent.getType().equals("text/plain")) {
        // Обробка наміру з текстом ...
    }
}

Повернення результату

Якщо хочете повернути результат до activity, яка викликала вашу activity, просто викликайте setResult(), щоб вказати код результату та Intent результату. Коли операція виконається, то користувач повинен повернутися до первісної activity і викликати finish(), щоб закрити (і знищити) свою activity. Наприклад:

// Створимо намір надати якісь дані результату
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri");
setResult(Activity.RESULT_OK, result);
finish();

Ви повинні з результатом завжди вказувати код результату. Як правило, це або RESULT_OK або RESULT_CANCELED. Ви можете надати додаткові дані з Intent, у разі потреби.

Примітка: Результат встановлений в RESULT_CANCELED за замовчуванням. Таким чином, якщо користувач натискає кнопку Back (Назад) до завершення дії і перш, ніж встановився результат, то первинна activity отримує "canceled" ("скасований") результат.

Якщо просто потрібно повернути ціле число, яке вказує один з декількох варіантів результату, то можете встановити будь-яке значення коду результату вище, ніж 0. Якщо використовуєте код результату, щоб доставити ціле і у вас немає необхідності включати Intent, то можна викликати setResult() і передати тільки код результату. Наприклад:

setResult(RESULT_COLOR_RED);
finish();

У цьому випадку можлива тільки жменька результатів, бо код результату локально визначається числом (більшим, ніж 0). Це добре працює, коли повертаєте результат в activity власного додатку, тому що activity, яка отримує результат, може посилатися на публічну константу, щоб визначити значення коду результату.

Примітка: Немає необхідності перевіряти, стартувала ваша activity зі startActivity() чи з startActivityForResult(). Просто викликайте setResult(), якщо намір, що запустив вашу activity, може очікувати результат. Якщо первинна activity була викликана зі startActivityForResult(), то система передає їй результат, який забезпечуєте setResult(); в іншому випадку, результат ігнорується.

(Джерело: 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 Новини

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