Поиск по сайту:

Учебное пособие по Android BroadcastReceiver


Сегодня мы обсудим и реализуем Android BroadcastReceiver, который является очень важным компонентом Android Framework.

Android BroadcastReceiver

Android BroadcastReceiver — это бездействующий компонент Android, который прослушивает общесистемные широковещательные события или намерения. Когда происходит какое-либо из этих событий, оно приводит приложение в действие, либо создавая уведомление в строке состояния, либо выполняя задачу. В отличие от действий Android BroadcastReceiver не содержит никакого пользовательского интерфейса. Широковещательный приемник обычно реализуется для делегирования задач службам в зависимости от типа полученных данных о намерениях. Ниже приведены некоторые из важных общесистемных сгенерированных намерений.

  1. android.intent.action.BATTERY_LOW : указывает на низкий уровень заряда батареи устройства.
  2. android.intent.action.BOOT_COMPLETED: передается один раз после завершения загрузки системы.
  3. android.intent.action.CALL: чтобы позвонить кому-то, указанному в данных
  4. android.intent.action.DATE_CHANGED: дата изменилась
  5. android.intent.action.REBOOT : перезагрузите устройство
  6. android.net.conn.CONNECTIVITY_CHANGE : подключение к мобильной сети или Wi-Fi изменено (или сброшено)

Широковещательный приемник в Android

Чтобы настроить широковещательный приемник в приложении для Android, нам нужно сделать следующие две вещи.

  1. Создание BroadcastReceiver
  2. Регистрация BroadcastReceiver

Создание широковещательного приемника

Давайте быстро реализуем собственный BroadcastReceiver, как показано ниже.

public class MyReceiver extends BroadcastReceiver {
    public MyReceiver() {
    }
 
    @Override
    public void onReceive(Context context, Intent intent) {
      
        Toast.makeText(context, "Action: " + intent.getAction(), Toast.LENGTH_SHORT).show();
    }
}

BroadcastReceiver — это абстрактный класс с абстрактным методом onReceiver(). Метод onReceiver() сначала вызывается для зарегистрированных широковещательных приемников, когда происходит какое-либо событие. Объект намерения передается со всеми дополнительными данными. Объект Context также доступен и используется для запуска действия или службы с помощью context.startActivity(myIntent); или context.startService(myService); соответственно.

Регистрация BroadcastReceiver в приложении для Android

BroadcastReceiver можно зарегистрировать двумя способами.

  1. Установив его в файле AndroidManifest.xml, как показано ниже.

<receiver android:name=".ConnectionReceiver" >
             <intent-filter>
                 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
             </intent-filter>
</receiver>

Используя фильтры намерений, мы сообщаем системе, что любое намерение, соответствующее нашим подэлементам, должно быть доставлено на этот конкретный широковещательный приемник. Определив его программно

IntentFilter filter = new IntentFilter();
intentFilter.addAction(getPackageName() + "android.net.conn.CONNECTIVITY_CHANGE");
 
MyReceiver myReceiver = new MyReceiver();
registerReceiver(myReceiver, filter);

Чтобы отменить регистрацию широковещательного приемника в onStop() или onPause() действия, можно использовать следующий фрагмент кода.

@Override
protected void onPause() {
    unregisterReceiver(myReceiver);
    super.onPause();
}

Отправка широковещательных намерений из действия

Следующий фрагмент используется для отправки намерения всем связанным BroadcastReceivers.

Intent intent = new Intent();
      intent.setAction("com.journaldev.CUSTOM_INTENT");
      sendBroadcast(intent);

Не забудьте добавить указанное выше действие в тег фильтра намерений манифеста или программно. Давайте разработаем приложение, которое прослушивает события изменения сети, а также пользовательское намерение и соответствующим образом обрабатывает данные.

BroadcastReceiver в структуре проекта Android

Код Android BroadcastReceiver

activity_main.xml состоит из кнопки в центре, которая отправляет широковещательное намерение.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.journaldev.broadcastreceiver.MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/button"
        android:text="Send Broadcast"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

MainActivity.java приведен ниже.

package com.journaldev.broadcastreceiver;

import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;

public class MainActivity extends AppCompatActivity {
    ConnectionReceiver receiver;
    IntentFilter intentFilter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ButterKnife.inject(this);

        receiver = new ConnectionReceiver();
        intentFilter = new IntentFilter("com.journaldev.broadcastreceiver.SOME_ACTION");

    }

    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(receiver, intentFilter);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        unregisterReceiver(receiver);
    }

    @OnClick(R.id.button)
    void someMethod() {

        Intent intent = new Intent("com.journaldev.broadcastreceiver.SOME_ACTION");
        sendBroadcast(intent);
    }
}

В приведенном выше коде мы программно зарегистрировали еще одно пользовательское действие. ConnectionReceiver определяется в файле AndroidManifest.xml, как показано ниже.

<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.journaldev.broadcastreceiver">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name=".ConnectionReceiver">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>

    </application>
</manifest>

Класс ConnectionReceiver.java определен ниже.

public class ConnectionReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        Log.d("API123",""+intent.getAction());

        if(intent.getAction().equals("com.journaldev.broadcastreceiver.SOME_ACTION"))
            Toast.makeText(context, "SOME_ACTION is received", Toast.LENGTH_LONG).show();

        else {
            ConnectivityManager cm =
                    (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            boolean isConnected = activeNetwork != null &&
                    activeNetwork.isConnectedOrConnecting();
            if (isConnected) {
                try {
                    Toast.makeText(context, "Network is connected", Toast.LENGTH_LONG).show();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                Toast.makeText(context, "Network is changed or reconnected", Toast.LENGTH_LONG).show();
            }
        }
    }

}

Скачать проект Android BroadcastReceiver