Содержание
Broadcast (Широковещательные сообщения)
Передача сообщений
Приёмники широковещательных сообщений
Периодическое срабатывание каждую минуту
Автостарт Activity или Service при загрузке (перезагрузке) девайса
Следим за питанием
В Android существует понятие широковещательных сообщений, которые можно отправлять или принимать. Оба процесса между собой не связаны и их можно использовать по отдельности.
Передача сообщений
Для начала научимся отправлять сообщения. В одном из уроков мы учились запускать другую активность с помощью намерения Intent. Но намерения можно использовать для отправки сообщений, предназначенные не какому-то отдельному приложению, объекту или компоненту, а всем. И любая программа, оборудованная специальным приёмником, может поймать это сообщение и предпринять свои шаги на основе полученной информации.
Для понимания, представьте, что радистка Кэт отправляет сообщение: «Срочно пришлите кота! Хочу быть сильной независимой женщиной. А ваш Штирлиц — фашист!». Возможно в этом сообщении содержится шифровка, что нужно прислать жену, столик для жены разведчика в кафе заказан, а Штирлиц — козёл! Но это не важно для нашего урока.
Любой человек, имеющий специальный оборудованный радиоприёмник, может принять это сообщение. Так же поступают и программы. Они обзаводятся приёмниками и прослушивают определённый тип сообщений.
Сообщения может создавать сама система, а также ваша программа и чужие программы.
Передача сообщений весьма проста в реализации. В вашем приложении необходимо создать сообщение, которое вы хотите передать.
Установите при необходимости поля action, data и category (действие, данные и категорию) вашего сообщения и путь, который позволяет приёмникам широковещательных сообщений точно определять «своё» сообщение.
В этом сообщении строка действия ACTION должна быть уникальной, чтобы идентифицировать передаваемое действие. В таких случаях создают строку-идентификатор действия по правилам именования пакетов Java. Например, для обнаружения кота в большом здании:
public static final String NEW_CAT_DETECTED = «ru.alexanderklimov.action.NEW_CAT»;
Далее вы создаёте объект Intent, загружаете в него нужную информацию и вызываете метод sendBroadcast(), передав ему в качестве параметра созданный объект Intent. Дополнительные данные можно использовать в extras как необязательные параметры.
Виртуальный код для обнаружения кота:
Intent intent = new Intent(NEW_CAT_DETECTED);// Или так// Intent intent = new Intent();// intent.setAction(NEW_CAT_DETECTED); intent.putExtra(«catname», CatName);intent.putExtra(«longitude», currentLongitude);intent.putExtra(«latitude», currentLatitude);sendBroadcast(intent);
В этом примере мы создали намерение с уникальной строкой, передали дополнительные данные (имя кота и его координаты), отправили сообщение. Другое приложение, связанное с картами, может принять сообщение и показать кота на карте.
Существуют также родственные методы sendStickyBroadcast() и sendOrderedBroadcast().
Для старых устройств этого было вполне достаточно, но начиная с Android 3.0, в целях безопасности сообщения будут игнорироваться остановленными приложениями, чтобы они не запускались. Поэтому следует добавлять дополнительный флаг, разрешающий запуск активности.
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
Мы напишем простой пример, который будет отправлять сообщения и также создадим приёмник для его получения. О приёмнике мы поговорим подробно во второй части урока. А пока получим первое представление о нём.
Создайте новый проект и разместите на экране кнопку с надписью «Отправить сообщение». Присвойте атрибуту onClick название метода, в котором будет происходит отправка широковещательного сообщения.
В классе активности создаём уникальную строку и реализуем метод для щелчка кнопки. Также добавим дополнительные данные — первую часть послания радистки.
public static final String WHERE_MY_CAT_ACTION = «ru.alexanderklimov.action.CAT»;public static final String ALARM_MESSAGE = «Срочно пришлите кота!»; public void sendMessage(View view) { Intent intent = new Intent(); intent.setAction(WHERE_MY_CAT_ACTION); intent.putExtra(«ru.alexanderklimov.broadcast.Message», ALARM_MESSAGE); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); sendBroadcast(intent);}
Запустив пример, вы можете нажать на кнопку и отправлять сообщение. Только ваше сообщение уйдёт в никуда, так как ни одно приложение не оборудовано приёмником для него. Исправим ситуацию и создадим приёмник в своём приложении. Мы будем сами принимать свои же сообщения.
Приёмник представляет собой обычный Java-класс на основе BroadcastReceiver. Вы можете создать вручную класс и наполнить его необходимыми методами. Раньше так и поступали. Но в студии есть готовый шаблон, который поможет немного сэкономить время.
Щёлкаем правой кнопкой мыши на названии пакета и выбираем New | Other | Broadcast Receiver
В диалоговом окне задаём имя приёмника, остальные настройки оставляем без изменений.
Студия создаст изменения в двух местах. Во-первых, будет создан класс MessageReceiver:
package ru.alexanderklimov.testapplication; import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent; public class MessageReceiver extends BroadcastReceiver { public MessageReceiver() { } @Override public void onReceive(Context context, Intent intent) { // TODO: This method is called when the BroadcastReceiver is receiving // an Intent broadcast. throw new UnsupportedOperationException(«Not yet implemented»); }}
Во-вторых, в манифесте будет добавлен новый блок.
В него следует добавить фильтр, по которому он будет ловить сообщения.
Вернёмся в класс приёмника и модифицируем метод onReceive().
@Overridepublic void onReceive(Context context, Intent intent) { Toast.makeText(context, «Обнаружено сообщение: » + intent.getStringExtra(«ru.alexanderklimov.broadcast.Message»), Toast.LENGTH_LONG).show();}
Снова запустим пример и ещё раз отправим сообщение. Так как наше приложение теперь оборудовано не только передатчиком, но и приёмником, то оно должно уловить сообщение и показать его нам.
Вы можете создать другое приложение с приёмником, чтобы одно приложение посылало сообщение, а другое принимало.
Приёмники широковещательных сообщений
Вот плавно мы перешли к приёмникам широковещательных сообщений. На самом деле вам не так часто придётся рассылать сообщения, гораздо чаще встречается потребность принимать сообщения. В первую очередь, сообщения от системы. Примерами таких сообщений могут быть:
- Низкий заряд батареи
- Нажатие на кнопку камеры
- Установка нового приложения
Приёмник можно создать двумя способами — через манифест (мы использовали этот способ в примере) и программно через метод registerReceiver(). Между двумя способами есть существенная разница. Приёмник, заданный в манифесте, известен системе, которая сканирует файлы манифеста всех установленных приложений. Поэтому, даже если ваше приложение не запущено, оно всё равно сможет отреагировать на поступающее сообщение.
Приёмник, созданный программно, может работать только в том случае, когда активность вашего приложения активна. Казалось, это является недостатком и нет смысла использовать такой подход. Но всё не так просто. Некоторые системные сообщения могут обрабатываться только приёмниками, созданными программно. И в этом есть свой резон.
Например, если ваше приложение не запущено, ему нет смысла принимать сообщения о заряде батареи. Иначе заряд батареи будет расходоваться ещё быстрее при лишней бесполезной работе. Информацию о заряде батареи ваше приложение может получить, когда в этом есть необходимость.
Следует сверяться с документацией, какой вид приёмника следует использовать.
При программной регистрации приёмника мы можем также снять регистрацию, когда больше не нуждаемся в нём с помощью метода unregisterBroadcastReceiver().
Периодическое срабатывание каждую минуту
Рассмотрим пример периодического срабатывания приёмника каждую минуту с помощью системного намерения android.intent.action.TIME_TICK. Приёмник будет создан программно. Добавим на экран активности две кнопки для регистрации и отмены регистрации широковещательного сообщения.
Создадим вручную новый класс TimeBroadcastReceiver, наследующий от BroadcastReceiver:
package ru.alexanderklimov.testapplication; import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast; import java.text.Format;import java.text.SimpleDateFormat;import java.util.Date; public class TimeBroadcastReceiver extends BroadcastReceiver { public TimeBroadcastReceiver() { } @Override public void onReceive(Context context, Intent intent) { StringBuilder msgStr = new StringBuilder(«Текущее время: «); Format formatter = new SimpleDateFormat(«hh:mm:ss a»); msgStr.append(formatter.format(new Date())); Toast.makeText(context, msgStr, Toast.LENGTH_SHORT).show(); }}
Вы можете создать класс приёмника и через шаблон, как мы это сделали в предыдущем примере. Но в этом случае удалите запись о нём в манифесте, так как нам он не понадобится. Но если вы забудете сделать это, то ничего страшного не произойдёт, так как там не прописаны фильтры.
Откроем код главной активности и зарегистрируем (а также снимем регистрацию) приёмник:
package ru.alexanderklimov.testapplication; import android.os.Bundle;import android.app.Activity;import android.content.IntentFilter;import android.view.Menu;import android.view.View;import android.widget.Toast; public class MainActivity extends Activity { private TimeBroadcastReceiver mTimeBroadCastReceiver = new TimeBroadcastReceiver(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // регистрируем широковещательный приёмник // для намерения «android.intent.action.TIME_TICK». // Данное намерение срабатывает каждую минуту public void registerBroadcastReceiver(View view) { this.registerReceiver(mTimeBroadCastReceiver, new IntentFilter( «android.intent.action.TIME_TICK»)); Toast.makeText(getApplicationContext(), «Приёмник включен», Toast.LENGTH_SHORT).show(); } // Отменяем регистрацию public void unregisterBroadcastReceiver(View view) { this.unregisterReceiver(mTimeBroadCastReceiver); Toast.makeText(getApplicationContext(), «Приёмник выключён», Toast.LENGTH_SHORT) .show(); }}
Запускаем проект и нажимаем на первую кнопку, чтобы включить рассылку широковещательного сообщения. Теперь каждую минуту будет срабатывать запуск всплывающего сообщения с текущим временем. Даже если вы переключитесь на другое приложение, то всё равно будете видеть сообщения.
Это один из примеров, когда приёмник следует регистрировать программно. Я видел часто на форумах вопросы, почему не работает данное намерение android.intent.action.TIME_TICK. А не надо было его регистрировать в манифесте.
В нашем примере мы устанавливали и снимали регистрацию через нажатия кнопок. Обычно включают регистрацию в методе onResume(), а снимают регистрацию в методе onPause().
Необходимо помнить, что программная регистрация широковещательного сообщения создаётся в основном потоке приложения и это может послужить источником ошибок, если операции в BroadcastReceiver занимают длительное время. Как вариант, используйте сервисы. Почитайте на эту тему статью (en).
Автостарт Activity или Service при загрузке (перезагрузке) девайса
Ещё один полезный пример, который часто используется приложениями.
Если ваше приложение (сервис) должно запускаться сразу после перезагрузки устройства, то используйте намерение android.intent.action.BOOT_COMPLETED:
public class BootReceiver extends BroadcastReceiver { Context mContext; private final String BOOT_ACTION = «android.intent.action.BOOT_COMPLETED»; @Override public void onReceive(Context context, Intent intent) { mContext = context; String action = intent.getAction(); if (action.equalsIgnoreCase(BOOT_ACTION)) { // здесь ваш код // например, запускаем уведомление Intent intent = new Intent(context, ru.alexanderklimov.NotifyService.NotifyService.class); context.startService(intent); // в общем виде //для Activity Intent activivtyIntent = new Intent(context, MyActivity.class); activivtyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(activivtyIntent); //для Service Intent serviceIntent = new Intent(context, MyService.class); context.startService(serviceIntent); } }}
Мы создали отдельный класс для широковещательного сообщения. Также нужно создать разрешение и зарегистрировать приёмник в манифесте.
Смотри также Автозапуск приложения при загрузке
Следим за питанием
Нет, речь пойдёт не о правильном питании кота. Имеется в виду питание от электричества. Если ваше устройство отключить от зарядки, то система оповещает об этом событии через широковещательное намерение android.intent.action.ACTION_POWER_DISCONNECTED.
Не станем заводить новый приёмник, а откроем манифест и добавим дополнительный фильтр к приёмнику сообщений от радистки Кэт.
А в классе MessageReceiver добавим код для метода.
@Overridepublic void onReceive(Context context, Intent intent) { //Toast.makeText(context, «Обнаружено сообщение: » + // intent.getStringExtra(«ru.alexanderklimov.broadcast.Message»), // Toast.LENGTH_LONG).show(); if (intent.getAction().equalsIgnoreCase(«android.intent.action.ACTION_POWER_DISCONNECTED»)) { String message = «Обнаружено сообщение » + intent.getAction(); Toast.makeText(context, message, Toast.LENGTH_LONG).show(); }}
Пример нужно проверять на реальном устройстве. Подключите устройство к питанию, а затем выдерните кабель. На экране появится сообщение.
Другие примеры
Теория
Получаем показания батареи в реальном времени
Отслеживание состояния соединения Wi-Fi
DownloadManager
Секретный код
Реклама
Источник: http://developer.alexanderklimov.ru/android/broadcast.php
Как отключить уведомления для любого приложения на Android
Устанавливая каждое приложение, владелец смартфона соглашается с запросами на доступ к определенным данным и возможностям устройства, среди которых есть и система уведомлений. Благодаря этому вы можете быть уверены, что не упустите действительно важные сообщения и напоминания, однако некоторый мобильный софт злоупотребляет этим, распространяя рекламные или частые нерелевантные оповещения.
Избавиться от назойливых уведомлений можно двумя способами – либо средствами системы Android, либо через настройки внутри самого приложения. Первый случай подходит только для смартфонов, основанных на версии 4.1 и выше, тогда как второй не зависит от модификации ОС.
Системное отключение уведомлений
Возможность настройки оповещений начала внедряться с устройств на базе Android Jelly Bean, на таких девайсах можно либо полностью отключить нотификации для каждого отдельного приложения, либо включить все. В Android 6 появилась уже более тонкая настройка, позволяющая регулировать частоту, звук и прочие параметры.
Пользователям последних версий достаточно нажать и удерживать на назойливое всплывающее уведомление, пока не появится возможность управлять им.
Буквально в два действия можно перевести все оповещения от приложения в беззвучный режим или вовсе заблокировать. Если этого недостаточно, следует перейти в «Другие настройки».
Выключив автоматический режим нажатием на букву «A», вы сможете регулировать уровень важности перемещением ползунка. В зависимости от его положения изменяется:
- Режим звука и вибрации;
- Приоритет уведомления относительно остальных;
- Разрешение на показ сообщений на экране блокировки.
Ниже доступны дополнительные опции, позволяющие определить, какая информация будет доступна на заблокированном экране – таким образом можно разрешить показ всех данных, за исключением личных (например, содержания сообщений) или блокировать уведомления подобного характера и не демонстрировать их без разблокировки девайса.
Также уведомления этого приложения можно перенести в категорию «Важные», и в таком случае они дадут о себе знать даже в режиме «Не беспокоить». Установив ограничение по частоте, вы не услышите более одного оповещения в течение заданного периода времени (от 10 секунд до 30 минут).
Как перейти в раздел уведомлений?
Перейти в то же меню, чтобы настроить нотификации для каждого приложения, можно и другим путем.
Зайдите в настройки телефона. Значок шестеренки расположен в общем меню либо в правой части «шторки».
Под заголовком «Устройство» нажмите по пункту «Приложения». Выбрав в списке подходящую утилиту, кликните по разделу «Уведомления».
В версиях, предшествующих Android 6, такого раздела нет, вы сможете поставить или снять галочку напротив пункта «Включить уведомления» в настройках выбранного приложения.
Если эта опция отсутствует на вашем телефоне, следует обновить оболочку или обратиться к настройкам самого приложения.
Отключение оповещений в приложениях
Большинство популярных приложений позволяет собственными средствами настраивать все поступающие уведомления – в первую очередь стоит воспользоваться ими, и только если они не решили проблему, переходить к системным настройкам.
Одно из главных системных приложений зачастую оповещает о текущей погоде, пробках и многом другом. Чтобы отключить уведомления от Google:
- Откройте меню жестом слева направо;
- Выберите пункт «Настройки»;
- Откройте раздел «Уведомления»;
В открывшемся окне можно настроить рингтон и вибросигнал для важных уведомлений, выбрать интересующие данные для оповещения или же отключить все.
Важные нотификации (например, при входе в аккаунт с нового устройства) полностью отключить не удастся.
Соцсети
Крупнейшая социальная сеть периодически беспокоит пользователей не только push-уведомлениями, но также регулярно отправляя SMS на мобильный номер.
Чтобы не получать больше сообщений от следует, открыв приложение, нажать на крайний правый значок «Меню». В самом низу в разделе «Помощь и настройки» откройте «Настройки уведомлений».
В верхней части вы выбираете, с чем связанные уведомления, вы желаете получать, в нижней – какими способами (среди доступных – push, электронное письмо и SMS).
В приложении от социальной сети «ВКонтакте» схожая система настройки оповещений. Чтобы ее открыть, нажмите в нижнем меню на значок колокольчика, затем на шестеренку в верхней части экрана.
Чтобы отключить нежелательные уведомления, перейдите в одну из категорий и выберите значение «Никакие». В самом низу расположен пункт «Дополнительные настройки», где можно изменить стандартный звук сообщений, цвет индикатора и прочие параметры.
Мессенджеры
Настройка уведомлений в большинстве мессенджеров, как правило, однотипная. Например, в WhatsApp нужно:
- Нажать на значок «Меню»;
- Выбрать пункт «Настройки»;
- Перейти в «Уведомления».
Чтобы отключить все оповещения, измените звук со стандартного на «Без звука», в пункте «Свет» выберите значение «Нет», а также запретите появление всплывающих окон.
Источник: https://CompConfig.ru/mobile/otklyuchenie-uvedomlenij-na-android.html
Как отключить оповещение населения (широковещательные сообщения) на смартфоне
Вопрос: Добрый день. Пару дней назад я купил сим-карту оператора, который поддерживает 3G, т.к. мне нужен быстрый мобильный интернет.
И вдруг я столкнулся с непредвиденной проблемой: на телефон стали приходить какие-то непонятные сообщения с иероглифами под названием «Оповещение населения». Сообщения приходят сотнями и их приходится удалять по одному.
Но самое раздражающее даже не это, а то, что эти оповещения мгновенно садят батарею. Ведь телефон постоянно пищит и вибрирует. Поэтому, я вынужден заряжать телефон по 3 раза в день — и дома, и на работе.
Ещё я так понимаю, что это как-то зависит от моего перемещения по городу — в каком-то месте телефон находится в состоянии покоя, а в другом снова Пару часов может быть тишина, а потом всплывающие сообщения «оповещение населения» снова начинают приходить. У меня смартфон Lenovo A1000, который я купил месяц назад. До этого использовался другой оператор, который работает в режиме 2G, и таких проблем на этом же смартфоне не было.
Итак, в этой статье мы попытаемся собрать всевозможные решения. К сожалению, одним помогает одно, другим — совершенно другое. Некоторые решения можно условно назвать решениями — это скорее способ обойти проблему.
Что такое широковещательная передача (Cell Broadcast)
Cell Broadcast (оно же «Широковещательные сообщения», «Сообщения сети» или «Информация БС») — это стандартная функция GSM-сети, призванная облегчить жизнь абоненту. Зачастую она служит для отображения названия текущей станции метро, ближайшего населенного пункта или телефонного кода местности.
На старых телефонах, вроде Nokia 3310, информация сети удобно отображалась на экране под названием оператора. Но на новых смартфонах широковещательные сообщения приходят как SMS-ки: со звуковым сигналом и отображаются в приложении Сообщения.
Стоит помнить, что включенная функция Cell Broadcast в любом случае дополнительно разряжает батарею.
В смартфонах lenovo:
Сообщения → Настройки → Параметры SMS/MMS → Менеджер сообщений по умолчанию → Оповещение населения.
Выберите SIM-карту, для которой нужно отключить оповещения, и снимите галки.
Отключение сообщений от базовой станции в Samsung Galaxy:
Зайдите в Сообщения.
Нажмите клавишу Меню (или долгое нажатие по клавише Недавние приложения).
Выберите Настройки.
Сообщения сети (или Настройки сообщений сети).
Нажмите на переключатель или снимите флажок, чтобы выключить:
В Android 4.4
В Android 5
Решение №2. Сменить канал широковещательной передачи
Войдите в Сообщения.
Вызовите меню и выберите Настройки.
Выберите Конфигурация каналов → Каналы приема → Мой канал.
После этого нажмите Добавить канал и введите номер (допустим, 10). По умолчанию используется канал №50, поэтому нужно указать какой-нибудь другой.
Решение №3. Переставить карту в другой слот
Этот способ реально помог моему знакомому отключить спам «оповещение населения» с иероглифами на смартфоне Lenovo A1000 с Android 5. Причем, интересно то, что во втором слоте SIM-карта тоже работает в режиме полноценного 3G (у некоторых моделей двухсимочных аппаратов в режиме 3G может работать лишь один из двух слотов). До конца не понятно, почему так происходит, но решение помогло избавиться от спама.
Решение №4. Сменить режим 3G на 2G
Если не помогло ничего из описанного выше, то напоследок расскажу вам еще об одном способе избавиться от назойливого оповещения населения на вашем телефоне. Переключите карту в режим 2G. На некоторых операторах это решает проблему. Естественно, скорость передачи данных будет снижена.
Войдите в Настройки → Другие сети → Мобильные сети → Режим сети.
Выберите 2G или Только GSM.
Это скорее «костыль», нежели решение… Однако если вы не пользуетесь Интернетом на телефоне, то у вас есть дополнительный шанс избавиться от широковещательного спама.
Послесловие
В завершение могу сказать еще вот о чем. Интернете пишут, что якобы оповещение население реально отключить на стороне оператора, выполнив какую-то USSD-команду, но нам такого решения найти не удалось. Операторы отсылают с данной проблемой к производителю смартфона. Поэтому, очень хотелось бы услышать мнение представителей компании Lenovo касательно данной проблемы на их аппаратах.
Источник: https://compfixer.info/opoveshenie-naseleniya/