BroadcastReceiver 用于异步接收广播Intent。主要有两大类,用于接收广播的:
- 正常广播 Normal broadcasts(用
Context.sendBroadcast
()发送)是完全异步的。它们都运行在一个未定义的顺序,通常是在同一时间。这样会更有效,但意味着receiver不能包含所要使用的结果或中止的API。 - 有序广播 Ordered broadcasts(用
Context.sendOrderedBroadcast()
发送)每次被发送到一个receiver。所谓有序,就是每个receiver执行后可以传播到下一个receiver,也可以完全中止传播——不传播给其他receiver。 而receiver运行的顺序可以通过matched intent-filter 里面的android:priority来控制,当priority优先级相同的时候,Receiver以任意的顺序运行
下面将详细的阐述如何发送Broadcast和使用BroadcastReceiver过滤接收的过程:
首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。
当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法。
public class SMSReciver extends BroadcastReceiver {
private static final String mACTION = "android.provider.Telephony.SMS_RECEIVED";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if( intent.getAction().equals(mACTION))
{
StringBuilder sb = new StringBuilder();
Bundle bundle = intent.getExtras();
if( null != bundle )
{
Toast.makeText(context,"来短信",Toast.LENGTH_SHORT).show();
}
}
else if( intent.getAction().equals("android.intent.action.PHONE_STATE"))
{
Log.i("SMSReceiver","Phone-----");
TelephonyManager teleManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
switch(teleManager.getCallState())
{
case TelephonyManager.CALL_STATE_RINGING:
Toast.makeText(context, "Ring"+intent.getStringExtra("incoming_number"),Toast.LENGTH_SHORT).show();
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Toast.makeText(context, "OFFHOOK"+intent.getStringExtra("incoming_number"),Toast.LENGTH_SHORT).show();
break;
case TelephonyManager.CALL_STATE_IDLE:
Toast.makeText(context, "IDLE"+intent.getStringExtra("incoming_number"),Toast.LENGTH_SHORT).show();
break;
}
}
else if( intent.getAction().equals("WHATFUCK"))
{
String str = intent.getStringExtra("DDD");//
Toast.makeText(context, "And What The Fuck" + str,Toast.LENGTH_SHORT).show();
}
}
}
下面是主动发送一个broadcast的动作,并附带了一些信息
Intent intent = new Intent("WHATFUCK");
intent.putExtra("DDD", "FFF");
sendBroadcast(intent);
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" /> 这个是收到短信的action
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
IntentFilter filter = new IntentFilter("WHATFUCK");
registerReceiver(reciver,filter);