В Android існує поняття широкомовних повідомлень, які можна відправляти або приймати. Обидва процеси між собою не пов'язані і їх можна використовувати окремо.
передача повідомлень
Для початку навчимося відправляти повідомлення. В одному з уроків ми вчилися запускати іншу активність за допомогою наміри Intent. Але наміри можна використовувати для відправки повідомлень, призначені не якомусь окремому додатку, об'єкту або компоненту, а всім. І будь-яка програма, обладнана спеціальним приймачем, може зловити це повідомлення і вжити свої кроки на основі отриманої інформації.
Для розуміння, уявіть, що радистка Кет відправляє повідомлення: "Терміново надішліть кота! Хочу бути сильною незалежною жінкою. А ваш Штірліц - фашист!". Можливо в цьому повідомленні міститься шифровка, що потрібно надіслати дружину, столик для дружини розвідника в кафе замовлений, а Штірліц - козел! Але це не важливо для нашого уроку.
Будь-яка людина, що має спеціальний обладнаний радіоприймач, може прийняти це повідомлення. Так само роблять і програми. Вони обзаводяться приймачами і прослуховують певний тип повідомлень.
Повідомлення може створювати сама система, а також ваша програма і чужі програми.
Далі ви створюєте об'єкт Intent. завантажуєте в нього потрібну інформацію і викликаєте метод sendBroadcast (). передавши йому в якості параметра створений об'єкт Intent. Додаткові дані можна використовувати в extras як необов'язкові параметри.
Віртуальний код для виявлення кота:
У цьому прикладі ми створили намір з унікальною рядком, передали додаткові дані (ім'я кота і його координати), відправили повідомлення. Інша програма, пов'язане з картами, може прийняти повідомлення і показати кота на карті.
Існують також родинні методи sendStickyBroadcast () і sendOrderedBroadcast ().
Для старих пристроїв цього було цілком достатньо, але починаючи з Android 3.0, в цілях безпеки повідомлення будуть ігноруватися зупиненими додатками, щоб вони не запускалися. Тому слід додавати додатковий прапор, який дозволяє запуск активності.
Ми напишемо простий приклад, який буде відправляти повідомлення і також створимо приймач для його отримання. Про приймачі ми поговоримо докладно у другій частині уроку. А поки отримаємо перше уявлення про нього.
Створіть новий проект і розмістіть на екрані кнопку з написом "Відправити повідомлення". Дайте атрибуту onClick назву методу, в якому буде відбувається відправка широкомовного повідомлення.
У класі активності створюємо унікальну рядок і реалізуємо метод для клацання кнопки. Також додамо додаткові дані - першу частину послання радистки.
Запустивши приклад, ви можете натиснути на кнопку і відправляти повідомлення. Тільки ваше повідомлення піде в нікуди, так як ні один додаток не обладнане приймачем для нього. Виправимо ситуацію і створимо приймач в своєму додатку. Ми будемо самі приймати свої ж повідомлення.
Приймач являє собою звичайний Java-клас на основі BroadcastReceiver. Ви можете створити вручну клас і наповнити його необхідними методами. Раніше так і надходили. Але в студії є готовий шаблон, який допоможе трохи заощадити час.
Клацаємо правою кнопкою миші на назві пакету і вибираємо New | Other | Broadcast Receiver
У діалоговому вікні задаємо ім'я приймача, інші настройки залишаємо без змін.
Студія створить зміни в двох місцях. По-перше, буде створений клас MessageReceiver:
По-друге, в маніфесті буде додано новий блок.
У нього слід додати фільтр, за яким він буде ловити повідомлення.
Повернемося до класу приймача і модифікуємо метод onReceive ().
Знову запустимо приклад і ще раз відправимо повідомлення. Так як наш додаток тепер обладнано не тільки передавачем, а й приймачем, то воно повинно вловити повідомлення і показати його нам.
Ви можете створити іншу програму з приймачем, щоб один додаток посилало повідомлення, а інше брало.
Приймачі широкомовних повідомлень
Ось плавно ми перейшли до приймачів широкомовних повідомлень. Насправді вам не так часто доведеться розсилати повідомлення, набагато частіше зустрічається потреба приймати повідомлення. В першу чергу, повідомлення від системи. Прикладами таких повідомлень можуть бути:
- Низький заряд батареї
- Натискання на кнопку камери
- Установка нової програми
Приймач можна створити двома способами - через маніфест (ми використовували цей спосіб в прикладі) і програмно через метод registerReceiver (). Між двома способами є істотна різниця. Приймач, заданий в маніфесті, відомий системі, яка сканує файли маніфесту всіх встановлених додатків. Тому, навіть якщо ваше програма не запущено, воно все одно зможе відреагувати на яке надходить повідомлення.
Приймач, створений програмно, може працювати тільки в тому випадку, коли активність вашого застосування активна. Здавалося, це є недоліком і немає сенсу використовувати такий підхід. Але все не так просто. Деякі системні повідомлення можуть оброблятися тільки приймачами, створеними програмно. І в цьому є свій резон. Наприклад, якщо ваш додаток не запущена, йому немає сенсу приймати повідомлення про заряд батареї. Інакше заряд батареї буде витрачатися ще швидше при зайвої непотрібної роботи. Інформацію про заряд батареї ваше додаток може отримати, коли в цьому є необхідність. Слід звірятися з документацією, який вид приймача слід використовувати.
При програмної реєстрації приймача ми можемо також зняти реєстрацію, коли більше не потребуємо в ньому за допомогою методу unregisterBroadcastReceiver ().
Періодичне спрацьовування кожну хвилину
Розглянемо приклад періодичного спрацьовування приймача кожну хвилину за допомогою системного наміри android.intent.action.TIME_TICK. Приймач буде створено програмно. Додамо на екран активності дві кнопки для реєстрації і скасування реєстрації широкомовного повідомлення.
Створимо вручну новий клас TimeBroadcastReceiver. успадковує від BroadcastReceiver:
Ви можете створити клас приймача і через шаблон, як ми це зробили в попередньому прикладі. Але в цьому випадку видаліть запис про нього в маніфесті, так як нам він не знадобиться. Але якщо ви забудете зробити це, то нічого страшного не станеться, так як там не прописані фільтри.
Відкриємо код головною активності і зареєструємо (а також знімемо реєстрацію) приймач:
Запускаємо проект і натискаємо на першу кнопку, щоб включити розсилку широкомовного повідомлення. Тепер кожну хвилину буде спрацьовувати запуск спливаючого повідомлення з поточним часом. Навіть якщо ви перейдіть на інший додаток, то все одно будете бачити повідомлення.
Це один із прикладів, коли приймач слід реєструвати програмно. Я бачив часто на форумах питання, чому не працює цей намір android.intent.action.TIME_TICK. А не треба було його реєструвати в маніфесті.
У нашому прикладі ми встановлювали і знімали реєстрацію через натискання кнопок. Зазвичай включають реєстрацію в методі onResume (). а знімають реєстрацію в методі onPause ().
Необхідно пам'ятати, що програмна реєстрація широкомовного повідомлення створюється в основному потоці додатки і це може послужити джерелом помилок, якщо операції в BroadcastReceiver займають тривалий час. Як варіант, використовуйте сервіси. Почитайте на цю тему статтю (en).
Автостарт Activity або Service при завантаженні (перезавантаження) девайса
Ще один корисний приклад, який часто використовується додатками.
Якщо ваш додаток (сервіс) має запускатися відразу після перезавантаження пристрою, то використовуйте намір android.intent.action.BOOT_COMPLETED:
Ми створили окремий клас для широкомовного повідомлення. Також потрібно створити дозвіл і зареєструвати приймач в маніфесті.
Стежимо за харчуванням
Ні, мова піде не про правильне харчування кота. Мається на увазі харчування від електрики. Якщо ваш пристрій відключити від зарядки, то система оповіщає про цю подію через широковещательное намір android.intent.action.ACTION_POWER_DISCONNECTED.
Чи не станемо заводити новий приймач, а відкриємо маніфест і додамо додатковий фільтр до приймача повідомлень від радистки Кет.
А в класі MessageReceiver додамо код для методу.
Приклад потрібно перевіряти на реальному пристрої. Підключіть пристрій до харчування, а потім витягніть кабель. На екрані з'явиться повідомлення.