Учебное пособие по Android BroadcastReceiver
Сегодня мы обсудим и реализуем Android BroadcastReceiver, который является очень важным компонентом Android Framework.
Android BroadcastReceiver
Android BroadcastReceiver — это бездействующий компонент Android, который прослушивает общесистемные широковещательные события или намерения. Когда происходит какое-либо из этих событий, оно приводит приложение в действие, либо создавая уведомление в строке состояния, либо выполняя задачу. В отличие от действий Android BroadcastReceiver
не содержит никакого пользовательского интерфейса. Широковещательный приемник обычно реализуется для делегирования задач службам в зависимости от типа полученных данных о намерениях. Ниже приведены некоторые из важных общесистемных сгенерированных намерений.
- android.intent.action.BATTERY_LOW : указывает на низкий уровень заряда батареи устройства.
- android.intent.action.BOOT_COMPLETED: передается один раз после завершения загрузки системы.
- android.intent.action.CALL: чтобы позвонить кому-то, указанному в данных
- android.intent.action.DATE_CHANGED: дата изменилась
- android.intent.action.REBOOT : перезагрузите устройство
- android.net.conn.CONNECTIVITY_CHANGE : подключение к мобильной сети или Wi-Fi изменено (или сброшено)
Широковещательный приемник в Android
Чтобы настроить широковещательный приемник в приложении для Android, нам нужно сделать следующие две вещи.
- Создание BroadcastReceiver
- Регистрация 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 можно зарегистрировать двумя способами.
- Установив его в файле
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