Broadcast receiver知识总结

                                              Broadcast receivers介绍

作者:朱博

Broadcast receivers介绍

Broadcast receivers 是对广播接收和回应的组件。系统会发出许多广播,比如时区的改变、电量过低,图片被选中等。应用也可生成广播,比如通知其他设备一些数据已经下载完成并且可以被使用。
应用程序可以有多个Broadcast receivers 去接收和回应重要的广播。所有的receivers 都必须继承BroadcastReceiver基类。
Broadcast receivers 没有用户界面。但是,他可以启动一个界面作为对广播的回应,或者使用NotificationManager提示用户。NotificationManager可以通过多种方式提示用户,比如闪烁背光灯,震动设备,播放提示音等等。手机状态条中会一直存在一个提示图标,用户可以打开它查看提示信息。

Broadcast receivers生命周期

一个Broadcast receiver有唯一的回调方法:

void onReceive(ContextcurContext, Intent broadcastMsg)

当接收到广播消息,android会调用onReceive()方法,同时传递Intent对象。Broadcast receiver只在执行onReceive()方法是活动状态,当方法执行结束会进入非活动状态。

当一个进程中含有活动状态的Broadcast receiver,系统会保护它不被结束。但是进程中只有非活动状态的组件,当其他进程需求内存使,它可能会系统在任何时间结束。

 当对广播的响应是一个耗时的操作需要在独立的线程中完成。换句话说,如果onReceive()产生了线程,那么整个进程包括新创建的线程都会认为是非活动状态(除非应用还有其他活动状态的组件),进入随时被结束的危险状态。解决的办法是开启一个Service完成所有工作,这样做系统会认为应用仍然处在活动状态。

特别需要注意的是你不能在onReceive()方法中显示一个dialog或者bind一个service。对于前者,你应该使用Notification API。对于后者,你可以使用Context.startService()。

BroadcastReceiver类

它是个基类用来接收sendBroadcast()发出的intent。你可以使用两种方式注册一个BroadcastReceiver

1、通过Context.registerReceiver()动态的注册一个该类的实例,

2、在AndroidManifest.xml中实现<receiver>标签静态的注册。

你可以在Activiy.onResume()中注册,在Activity.onPause移除注册,或者在Activity.onStart()中注册,在Activity.onStop()中移除注册。不要在Activity.onSaveInstanceState()中国移除注册,因为用户在返回历史栈时它不会调用。

在AndroidManifest中注册BroadcastReceiver和在代码中注册BroadcastReceiver效果都是一样的,该BroadcastReceiver都会生效.

但是区别在于在代码中用registerReceiver方法注册后,若对其进行注册的Context对象"销毁"了或者调用了unregisterReceiver方法,注册的BroadcastReceiver也就失效了.
而在AndroidManifest中注册,只要安装的应用没有被删除,BroadcastReceiver一直都有效.

接收的两种主要广播:

1.正常广播(以Context,sendBroadcast发送的)是完全异步的。所有接收者在接收时没有指定的顺序,通常是同事接收到广播的。它是高效的,但是意味着接受者不能使用返回的结果。

2.含有顺序的广播(以Context,sendOrderedBroadcast发送的)是每次发送给一个接受者的。每次接受者顺序接收。它可以传递结果给下一个接受者,或者它可以废除这个广播不传给任何接受者。这些顺序接受者可以使用android:priority属性去匹配intent-filter,相同优先级的接受者会以随意的顺序接收。

注意:尽管发送和接受广播使用intent,但是intent广播机制与使用intent启动Activity(Context.startActivity())是完全不同的。你无法接受或捕获用于启动Activity的intent。使用intent开启Activity是一种改变用户正在执行对象的显示操作,而广播intent通常是用户无法意识到的后台操作。

 

你可能感兴趣的:(Broadcast receiver知识总结)