Android开发学习教程(29)- Android BroadcastReceiver(广播)

78 阅读2分钟

—— 今朝有心苦勤奋,明朝一举步青云。

Broadcast receiver是什么

Broadcast receiver(广播接收器)是一个Android 组件,它允许你注册系统或应用程序事件。一旦该事件发生,Android 运行时会通知所有已注册的事件接收者。举个简单的例子,这就好比在学校里,当训导主任广播寻找王小明时,训导主任只需要告知要找的是几年几班的王小明(不用知道他在哪里),尽管全校的同学都会听到这则广播,但会去训导处报到的,就只有王小明。在android 中,我们时常需要利用此一机制,让程序能在任何时候,对于不同的广播讯息做出正确的反馈。例如,当注册了 ACTION_BOOT_COMPLETED广播后,一旦 Android 系统完成启动过程程序的广播接收器就会收到响应。

Broadcast receiver的生命周期

Android开发学习教程(29)- Android BroadcastReceiver(广播)

广播的生命周期并不像 Activity 一样复杂,广播的生命周期从调用开始到onReceiver执行完毕结束,需要注意的是,一般广播的生命周期都极短,需要在10s内处理完onReceiver中的所有工作,所以,一般不进行耗时长的工作,如果有耗时长的工作,应当通过Intent传递给Service进行处理。(注意,不要在onReceiver中开启线程进行耗时任务处理,否则,在10s后,该线程会变成空线程,从而导致任务的丢失。同样的,也不要使用bindService来绑定服务。)

值得注意的是,如果是在代码中动态注册的广播,如:在Activity注册,那么在Activity的onDestory中需要使用unregisterReceiver注销广播。

Broadcast receiver的用法

可以通过 AndroidManifest.xml 文件注册广播接收器,除了这种静态注册,还可以通过该 Context.registerReceiver() 方法动态注册广播接收器。接收器的实现类需要实现 BroadcastReceiver接口。如果广播接收器注册的事件发生,onReceive() Android系统调用接收器的方法,

  1. 静态注册广播

静态注册一个飞行模式变化的广播

123456<``receiver android:name``=``".MyScreenReceiver" >``    ``<``intent-filter``>``        ``<``action android:name``=``"android.intent.action.AIRPLANE_MODE" />``    ``</``intent-filter``>``</``receiver``>

创建一个BroadcastReceiver广播接收器

123456789public class MyScreenReceiver ``extends BroadcastReceiver {``  ``@Override``  ``public void onReceive(Context context, Intent intent) {``      ``Log.d(``"hel->"``, ``"飞行模式发生了变化..."``);``  ``}``}

当开启飞行模式或者关闭飞行模式时onReceive方法响应。

  1. 动态注册广播
12345678910111213141516171819202122232425public class MainActivity ``extends AppCompatActivity {``    ``private AirplaneModeChangeReceiver receiver;``    ``@Override``    ``protected void onCreate(Bundle savedInstanceState) {``        ``super``.onCreate(savedInstanceState);``        ``setContentView(R.layout.activity_main);``        ``findViewById(R.id.btn2).setOnClickListener(``new View.OnClickListener() {``            ``@Override``            ``public void onClick(View v) {``                ``receiver = ``new AirplaneModeChangeReceiver();``                ``IntentFilter filter = ``new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);``                ``registerReceiver(receiver, filter);``            ``}``        ``});``    ``}``    ``@Override``    ``protected void onDestroy() {``        ``super``.onDestroy();``        ``unregisterReceiver(receiver);``    ``}``}