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

Запуск іншої activity не повинен бути одностороннім. Ви можете також запустити нову activity і отримати назад результат. Щоб отримати результат, викликають startActivityForResult() (замість startActivity()).

Наприклад, ваш додаток може запустити додаток камери і отримати зроблений знімок як результат. Або, ви можете запустити додаток People для того, щоб користувач міг вибрати контакт, і ви будете отримувати контактну інформацію, як результат.
Звичайно, activity, що відповідає, повинна бути розроблена так, щоб повертала результат. Коли це відбувається, вона посилає результат як інший об'єкт Intent. Ваша activity отримує його в зворотному виклику onActivityResult().

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

Запуск Activity

Немає нічого особливого в об'єкті Intent, який використовуєте, запускаючи activity, щоб отримати результат, але ви повинні направити додатковий цілочисельний аргумент до методу startActivityForResult().
Цілочисельний аргумент "request code" ("код запиту") ідентифікує ваш запит. Коли отримуєте результат Intent, то зворотний виклик забезпечує той же код запиту, тому ваш додаток може правильно визначити результат і як з ним поводитися.
Приклад, як запустити activity, що дозволяє користувачеві вибрати контакт:

static final int PICK_CONTACT_REQUEST = 1;  // Код запиту
...
private void pickContact() {
    Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
    pickContactIntent.setType(Phone.CONTENT_TYPE); // Показати користувачів лише з контактами / номерами телефонів
    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}

Отримання результату

Коли користувач закінчить з відправкою activity та зворотною відповіддю, система викликає метод onActivityResult() вашої activity. Цей метод включає в себе три аргументи:

• Код запиту, який ви відправили в startActivityForResult().
• Код результату, вказаний другою activity. Це або RESULT_OK, якщо операція пройшла успішно, або RESULT_CANCELED, якщо користувач відмовився чи операція не вдалася з певних причин.
Intent, який доставляє дані результату.

Приклад, як ви можете впоратися з результатом для наміру "підібрати контакт":

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Перевірити, на який запит маємо реакцію
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Переконайтеся, що запит був успішним
        if (resultCode == RESULT_OK) {
            // Користувач вибрав контакт.
            // Дані наміру в Uri визначають, який контакт був вибраний.

            // Тут зробити щось з контактом (більший приклад нижче)
        }
    }
}

У цьому прикладі, результат Intent, повернутий додатком Contacts або People Android, забезпечує контент Uri, який ідентифікує вибраний користувачем контакт.
Для того, щоб успішно впоратися з результатом, ви повинні розуміти, який буде формат результату Intent. Це легко, коли повернутий activity результат є одним з ваших власних activity. Додатки, включені з Android-платформу, пропонують свої власні API, на конкретні дані результатів яких ви можете розраховувати. Наприклад, додаток People (додаток Contacts на деяких старих версіях) завжди повертає результат з вмістом URI, який ідентифікує обраний контакт, а додаток Camera повертає Bitmap в "extra" даних.

Бонус: Читаємо контактні дані

Код вище показує, як отримати результат від додатку People, не вдаючись в подробиці про те, як насправді прочитати дані з результату, тому що вимагає більш детального обговорення доставки контенту. Тим не менше, якщо вам цікаво, ось ще трохи коду, який показує, як запросити дані результату, щоб отримати номер телефону з обраного контакту:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Перевірка, на який запит ми отримали реакцію
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Переконайтеся, що запит був успішним
        if (resultCode == RESULT_OK) {
            // Отримати URI, який вказує на обраний контакт
            Uri contactUri = data.getData();
            // Нам потрібний лише стовпець NUMBER, тому що там в результаті буде тільки один рядок
            String[] projection = {Phone.NUMBER};

            // Виконати запит на контакт, щоб отримати стовпчик NUMBER
            // Нам не потрібний вибір або сортування (є лише один результат для даного URI)
            // УВАГА: Метод query() повинен бути викликаний з окремого потоку, щоб уникнути блокування потоку UI вашого додатку.
            // (Для спрощення прикладу, код не наводиться.)
            // Розгляньте можливість використання CursorLoader для виконання запиту.
            Cursor cursor = getContentResolver()
                    .query(contactUri, projection, null, null, null);
            cursor.moveToFirst();

            // Отримати номер телефону з колонки NUMBER
            int column = cursor.getColumnIndex(Phone.NUMBER);
            String number = cursor.getString(column);

            // Зробити що-небудь з номером телефону ...
        }
    }
}

Примітка: До Android 2.3 (API рівня 9), виконання запиту на Contacts Provider (як показано вище) вимагає, щоб ваш додаток оголосив дозвіл READ_CONTACTS. Однак, починаючи з Android 2.3, додатки Contacts/People надають вашому додатку тимчасовий дозвіл на читання з Contacts Provider, коли вони повертають вам результат. Тимчасовий дозвіл відноситься тільки до певного запитуваного контакту, так що ви не можете запросити інший контакт, ніж зазначений в Uri намірі, якщо тільки не оголосите дозвіл READ_CONTACTS.

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

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