BroadcastReceiver

BroadcastReceiver配置
//配置receiver的action匹配项,对应的activity类名(在activity中配置)
<activity>
    <receiver andorid:name=".ReceiverClassName">
        <intent-filter>
            <action...../>
        </intent-filter>
    </receiver>
</activity>



BroadcastReceiver的执行
  • 在广播消息到达时,系统会创建一个新的BroadcastRceiver实例并执行onReceive()方法处理广播响应,当处理完成后实例就会被销毁
  • 在onReceive()中如果处理时间超过5秒会产生ANR(Application not response)的错误
  • 在onReceive()中不能处理耗时的操作,如果需要进行耗时操作时,必须使用service,不可以使用子线程。这是由于使用子线程的话,onRecive()的处理时间很短,当创建子线程处理时,主线程已经处理被销毁,该子线程所在的进程即成为了空进程;当系统需要回收内存空间时,优先回收空进程,因此子线程可能无法完成就会被回收,这是不可靠的

发送广播
  • sendBroadcast(),发送Normal Broadcast,完全异步,可以在同一时刻被所有接收者接收到传递效率高
  • sendOrderedBroadcast(),发送Orderred Broadcast,按优先及依次接收广播并处理,可以将处理的结果传递给下一个接收者处理,效率比较低
//使用OrderedBroadcast优先接收的接收者可以终止广播的传递,使后面的接收者不再接收到该广播(拦截)
//优先接收的接收者可以通过setResultExtras(Bundle)将处理结果存入broadcast传递给下一个接收者
//重写接收者onReceive()方法
public void onReceive(Context context, Intent intent){
    //传递新数据
    Bundle data=new Bundle();
    data.putString("key","vaule");
    setResultExtras(data);
    //取消broadcast传播
    //abortBroadcast();
}



  • 配置优先级
//在activity中注册的receiver中配置
<activity>
    <!--注册receiver,指定该组件的类名-->
    <receiver android:name=".ReceiverClassName">
        <!--设置receiver的优先级,-1000到1000之间的值,值越大,优先级越高-->
        <intent-filter android:priority="1000">
            <!--设置receiver对应的action,用于匹配并启动receiver-->
            <action.../>
        </intent-filter>
    </reciver>
</activity>



  • 部分系统广播在发送时已经指定了必须接收的broadcastReceiver,此时终止广播并不能阻止该receiver接收到广播(如拨号程序)

你可能感兴趣的:(android,Broadcast)