» Программирование Android

Использование Broadcast Receiver на наглядном примере

Broadcast Receivers – один из компонентов приложения для операционной системы Android. В данной статье мы попытаемся нагляднее объяснить «что это такое и с чем его едят», написав приложение, отслеживающее состояние соединения посредством Wi-Fi и уведомляющее пользователя о любых его изменениях.

С тем, что такое Broadcast receivers, и с другими компонентами Android-приложения мы уже ознакомились в другом материале. В данной статье мы подойдем к данному компоненту с практической точки зрения. Поэтому создаем новый проект и принимаемся за работу.

Вначале описываем приложение в AndroidManifest.xml. Нам нужно объявить компонент Broadcast receiver для слежения за состоянием Wi-Fi соединения, и дать программе права получать информацию о состоянии этого соединения. Компонент Activity мы также опишем, но на данный момент он не будет иметь никакой функциональной нагрузки. Что должно получится в AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

      package="com.broadcast.receiver.example"

      android:versionCode="1"

      android:versionName="1.0">

    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">

        <activity android:name=".BR_Example"

                  android:label="@string/app_name">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

            <!-- Declaring broadcast receiver for wifi status changing event -->

                        <receiver android:name=".WiFiStatusReceiver" android:enabled="true" android:exported="false">

                                   <intent-filter>

                                               <action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE"/>

                                   </intent-filter>

                        </receiver>

            </application>

            <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

</manifest>
 
То есть, как видно по представленному выше коду, необходимо создать .java-класс, который будет занят обработкой сигналов, поступивших от Broadcast receiver. Создаем класс WiFiStatusReceiver.java, в тело которого вписываем следующий код:
package com.broadcast.receiver.example;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.net.wifi.WifiManager;

import android.widget.Toast;

public class WiFiStatusReceiver extends BroadcastReceiver {

            public static Context mContext;

            @Override

    public void onReceive(Context context, Intent intent) {

                        if (mContext == null) mContext = context;

                        final WifiManager wm = (WifiManager) mContext.getSystemService(mContext.WIFI_SERVICE);

                        if (intent.getBooleanExtra(wm.EXTRA_SUPPLICANT_CONNECTED, true)) {

                                   Toast.makeText(context, "Wifi connected to network" , Toast.LENGTH_LONG).show();

                        }

                        if (!intent.getBooleanExtra(wm.EXTRA_SUPPLICANT_CONNECTED, true)) {

                                   Toast.makeText(context, "Wifi disconnected from network" , Toast.LENGTH_LONG).show();

                        }

    }

}         

В целом основная часть работы сделана. Даже без запуска приложения нужный нам Broadcast receiver будет в системе, и при включении/выключении Wi-Fi появится соответствующее оповещение:

Теперь рассмотрим, что же собственно мы сделали. Вот так задается Broadcast receiver в «манифесте» (AndroidManifest.xml):

<receiver android:name=".WiFiStatusReceiver" android:enabled="true" android:exported="false">

    <intent-filter>

        <action android:name="android.net.wifi.supplicant.CONNECTION_CHANGE"/>

    </intent-filter>

</receiver> 

Каждому из Broadcast receivers нужно присвоить своё имя (например android:name=».WiFiStatusReceiver»). Указанное имя должно соответствовать классу, который будет обрабатывать поступившие Intents от соответствующего Broadcast receiver.

В тегах <intent-filter> задаются фильтры для событий. Если событие соответствует фильтрам, то есть условиям, указанным между тегами, запускается класс-обработчик.

Перейдем к классу WiFiStatusReceiver.java. Нужно помнить, что наследовать классы java нужно от класса BroadcastReceiver. Далее применяем весьма удобный системный класс WiFiManager для того, чтобы определить текущее состояние Wi-Fi соединения и сравниваем полученное значение с константами, которые отвечают за включенный или выключенный Wi-Fi. Если константы и состояния совпадают, то пользователю выводится сообщение. Для вывода сообщения используются Toast-уведомления (всплывающие полупрозрачные надписи).

Вот мы и создали наглядный и достаточно простой пример работы Broadcast receivers. Сохраняем проект и запускаем его на Android-устройстве или через эмулятор и радуемся проделанной работе.

john
2014-10-28 18:38:07
А экземпляр WifiManager получаем только для того чтобы вытащить из него статическое поле EXTRA_SUPPLICANT_CONNECTED ? Оно ведь доступно вот таким образом: WifiManager.EXTRA_SUPPLICANT_CONNECTED И вот это: intent.getBooleanExtra(wm.EXTRA_SUPPLICANT_CONNECTED, true) не означает что мы: "сравниваем полученное значение с константами". Мы просто получаем из intent данные из элемента "connected" (именно строка "connected" содержится в wm.EXTRA_SUPPLICANT_CONNECTED). Ну и два if вместо else. Возвращение true по умолчанию из getBooleanExtra и прочие странности.