Вещательные приемники просто отвечают на широковещательные сообщения из других приложений или из самой системы. Эти сообщения иногда называют событиями или намерениями. Например, приложения могут также инициировать широковещательные рассылки, чтобы сообщить другим приложениям, что некоторые данные были загружены на устройство и доступны для их использования, поэтому этот широковещательный приемник будет перехватывать эту связь и инициировать соответствующие действия.
Существует два важных шага, чтобы заставить BroadcastReceiver работать для систем, предназначенных для вещания.
-
Создание приемника вещания.
-
Регистрация приемника вещания
Создание приемника вещания.
Регистрация приемника вещания
Есть один дополнительный шаг, если вы собираетесь реализовать свои собственные намерения, тогда вам придется создавать и передавать эти намерения.
Создание приемника вещания
Приемник широковещания реализован как подкласс класса BroadcastReceiver и переопределяет метод onReceive (), где каждое сообщение принимается в качестве параметра объекта Intent .
открытый класс MyReceiver extends BroadcastReceiver { @Override public void onReceive (Контекст контекста, Намерение намерения) { Toast.makeText (контекст, «Обнаружено намерение.», Toast.LENGTH_LONG) .show (); } }
Регистрация приемника вещания
Приложение прослушивает определенные намерения вещания, регистрируя получателя вещания в файле AndroidManifest.xml . Предположим, что мы собираемся зарегистрировать MyReceiver для сгенерированного системой события ACTION_BOOT_COMPLETED, которое запускается системой, когда система Android завершила процесс загрузки.
Broadcast-приемник
<приложение Android: значок = "@ вытяжка / ic_launcher" андроид: метка = "@ строка / app_name" android: theme = "@ style / AppTheme"> <получатель android: name = "MyReceiver"> <Намерения фильтр> <action android: name = "android.intent.action.BOOT_COMPLETED"> </ Действие> </ Намерение фильтр> </ Приемник> </ Приложение>
Теперь, когда ваше Android-устройство загружается, оно будет перехвачено BroadcastReceiver MyReceiver, и будет реализована реализованная логика внутри onReceive () .
Существует несколько сгенерированных системой событий, определенных как окончательные статические поля в классе Intent . В следующей таблице перечислены несколько важных системных событий.
Sr.No | Событие постоянное и описание |
---|---|
1 |
android.intent.action.BATTERY_CHANGED Липкая трансляция, содержащая состояние зарядки, уровень и другую информацию о батарее. |
2 |
android.intent.action.BATTERY_LOW Указывает на низкий уровень заряда батареи на устройстве. |
3 |
android.intent.action.BATTERY_OKAY Указывает на то, что батарея в порядке после низкого уровня заряда. |
4 |
android.intent.action.BOOT_COMPLETED Это транслируется один раз после завершения загрузки системы. |
5 |
android.intent.action.BUG_REPORT Показать активность для сообщения об ошибке. |
6 |
android.intent.action.CALL Выполните звонок кому-либо, указанному в данных. |
7 |
android.intent.action.CALL_BUTTON Пользователь нажал кнопку «вызов», чтобы перейти на номеронабиратель или другой соответствующий пользовательский интерфейс для совершения вызова. |
8 |
android.intent.action.DATE_CHANGED Дата изменилась. |
9 |
android.intent.action.REBOOT Перезагрузите устройство. |
android.intent.action.BATTERY_CHANGED
Липкая трансляция, содержащая состояние зарядки, уровень и другую информацию о батарее.
android.intent.action.BATTERY_LOW
Указывает на низкий уровень заряда батареи на устройстве.
android.intent.action.BATTERY_OKAY
Указывает на то, что батарея в порядке после низкого уровня заряда.
android.intent.action.BOOT_COMPLETED
Это транслируется один раз после завершения загрузки системы.
android.intent.action.BUG_REPORT
Показать активность для сообщения об ошибке.
android.intent.action.CALL
Выполните звонок кому-либо, указанному в данных.
android.intent.action.CALL_BUTTON
Пользователь нажал кнопку «вызов», чтобы перейти на номеронабиратель или другой соответствующий пользовательский интерфейс для совершения вызова.
android.intent.action.DATE_CHANGED
Дата изменилась.
android.intent.action.REBOOT
Перезагрузите устройство.
Трансляция пользовательских интентов
Если вы хотите, чтобы ваше приложение само генерировало и отправляло пользовательские намерения, вам придется создавать и отправлять эти намерения с помощью метода sendBroadcast () внутри вашего класса активности. Если вы используете метод sendStickyBroadcast (Intent) , Intent остается закрепленным , то есть отправляемое Intent остается после завершения трансляции.
public void broadcastIntent (Просмотр представления) { Намерение намерение = новое намерение (); intent.setAction ( "com.tutorialspoint.CUSTOM_INTENT"); sendBroadcast (намерение); }
Это намерение com.tutorialspoint.CUSTOM_INTENT также может быть зарегистрировано аналогичным образом, поскольку мы зарегистрировали намерение, сгенерированное системой.
<приложение Android: значок = "@ вытяжка / ic_launcher" андроид: метка = "@ строка / app_name" android: theme = "@ style / AppTheme"> <получатель android: name = "MyReceiver"> <Намерения фильтр> <action android: name = "com.tutorialspoint.CUSTOM_INTENT"> </ Действие> </ Намерение фильтр> </ Приемник> </ Приложение>
пример
Этот пример объяснит вам, как создать BroadcastReceiver для перехвата пользовательских намерений. Как только вы ознакомитесь с пользовательским намерением, вы можете запрограммировать свое приложение на перехват сгенерированных системой намерений. Итак, давайте сделаем следующие шаги, чтобы изменить приложение Android, которое мы создали в главе « Hello World Example» —
шаг | Описание |
---|---|
1 | Вы будете использовать Android studio для создания Android-приложения и назовите его « Мое приложение» в пакете com.example.tutorialspoint7.myapplication, как описано в главе « Пример Hello World» . |
2 | Измените основной файл активности MainActivity.java, чтобы добавить метод broadcastIntent () . |
3 | Создайте новый Java-файл с именем MyReceiver.java в пакете com.example.tutorialspoint7.myapplication для определения BroadcastReceiver. |
4 | Приложение может обрабатывать одно или несколько пользовательских и системных намерений без каких-либо ограничений. Каждое намерение, которое вы хотите перехватить, должно быть зарегистрировано в вашем файле AndroidManifest.xml с помощью тега <receiver … /> |
5 | Измените содержимое по умолчанию файла res / layout / activity_main.xml, добавив в него кнопку для трансляции намерений. |
6 | Нет необходимости изменять строковый файл, Android Studio позаботится о файле string.xml. |
7 | Запустите приложение, чтобы запустить эмулятор Android, и проверьте результат изменений, внесенных в приложение. |
Ниже приводится содержимое измененного основного файла активности MainActivity.java . Этот файл может включать в себя каждый из основных методов жизненного цикла. Мы добавили метод broadcastIntent () для трансляции пользовательских намерений.
пакет com.example.tutorialspoint7.myapplication; импорт android.app.Activity; импорт android.content.Intent; импорт android.os.Bundle; импорт android.view.View; открытый класс MainActivity расширяет Activity { / ** Вызывается при первом создании действия. * / @Override public void onCreate (BundlevedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); } // широковещательно настроенное намерение. public void broadcastIntent (Просмотр представления) { Намерение намерение = новое намерение (); intent.setAction ( "com.tutorialspoint.CUSTOM_INTENT"); sendBroadcast (намерение); } }
Ниже приводится содержание MyReceiver.java :
пакет com.example.tutorialspoint7.myapplication; import android.content.BroadcastReceiver; импорт android.content.Context; импорт android.content.Intent; импорт android.widget.Toast; / ** * Создано TutorialsPoint7 от 23.08.2016. * / открытый класс MyReceiver extends BroadcastReceiver { @Override public void onReceive (Контекст контекста, Намерение намерения) { Toast.makeText (контекст, «Обнаружено намерение.», Toast.LENGTH_LONG) .show (); } }
Ниже будет измененный контент файла AndroidManifest.xml . Здесь мы добавили тег <receive … />, чтобы включить наш сервис:
<? xml version = "1.0" encoding = "utf-8"?> <manifest xmlns: android = "http://schemas.android.com/apk/res/android" пакет = "com.example.tutorialspoint7.myapplication"> <приложение андроид: allowBackup = "истина" Android: значок = "@ мипмап / ic_launcher" андроид: метка = "@ строка / app_name" андроид: supportsRtl = "истина" Android: тема = "@ стиль / AppTheme"> <activity android: name = ". MainActivity"> <Намерения фильтр> <action android: name = "android.intent.action.MAIN" /> <category android: name = "android.intent.category.LAUNCHER" /> </ Намерение фильтр> </ Деятельность> <получатель android: name = "MyReceiver"> <Намерения фильтр> <action android: name = "com.tutorialspoint.CUSTOM_INTENT"> </ Действие> </ Намерение фильтр> </ Приемник> </ Приложение> </ Манифеста>
Ниже будет содержимое файла res / layout / activity_main.xml, включающего кнопку для трансляции нашего собственного намерения —
<RelativeLayout XMLNS: андроид = "http://schemas.android.com/apk/res/android" XMLNS: инструменты = "http://schemas.android.com/tools" андроид: layout_width = "match_parent" андроид: layout_height = "match_parent" андроид: paddingLeft = "@ DIMEN / activity_horizontal_margin" андроид: paddingRight = "@ DIMEN / activity_horizontal_margin" андроид: paddingTop = "@ DIMEN / activity_vertical_margin" андроид: paddingBottom = "@ DIMEN / activity_vertical_margin" инструменты: контекст = "MainActivity"> <TextView андроид: идентификатор = "@ + идентификатор / textView1" андроид: layout_width = "wrap_content" андроид: layout_height = "wrap_content" android: text = "Пример трансляции" андроид: layout_alignParentTop = "истина" андроид: layout_centerHorizontal = "истина" android: textSize = "30dp" /> <TextView андроид: идентификатор = "@ + идентификатор / textView2" андроид: layout_width = "wrap_content" андроид: layout_height = "wrap_content" android: text = "Учебное пособие" андроид: TextColor = "# ff87ff09" андроид: TextSize = "30dp" андроид: layout_above = "@ + идентификатор / IMAGEBUTTON" андроид: layout_centerHorizontal = "истина" android: layout_marginBottom = "40dp" /> <ImageButton андроид: layout_width = "wrap_content" андроид: layout_height = "wrap_content" андроид: идентификатор = "@ + идентификатор / IMAGEBUTTON" андроид: SRC = "@ вытяжка / а" андроид: layout_centerVertical = "истина" android: layout_centerHorizont = "true" /> <Кнопка андроид: layout_width = "wrap_content" андроид: layout_height = "wrap_content" андроид: идентификатор = "@ + идентификатор / button2" android: text = "Broadcast Intent" андроид: OnClick = "broadcastIntent" андроид: layout_below = "@ + идентификатор / IMAGEBUTTON" android: layout_centerHorizont = "true" /> </ RelativeLayout>
Давайте попробуем запустить наш модифицированный Hello World! Приложение, которое мы только что изменили. Я предполагаю, что вы создали свой AVD во время настройки среды. Чтобы запустить приложение из студии Android, откройте один из файлов деятельности вашего проекта и нажмите «Выполнить». значок из панели инструментов. Android Studio устанавливает приложение на AVD и запускает его, и если все в порядке с настройкой и приложением, оно отобразится в следующем окне эмулятора —
Теперь для трансляции нашего пользовательского намерения, давайте нажмем кнопку « Broadcast Intent» , это будет транслировать наше пользовательское намерение «com.tutorialspoint.CUSTOM_INTENT», которое будет перехвачено нашим зарегистрированным BroadcastReceiver, то есть MyReceiver, и согласно нашей реализованной логике в нижней части появится тост. симулятора следующим образом —
Вы можете попробовать реализовать другой BroadcastReceiver, чтобы перехватывать сгенерированные системой намерения, такие как загрузка системы, изменение даты, низкий заряд батареи и т. Д.