BroadcastReceiver,Android四大组件之一,本质上就是一种全局的监听器,用于监听系统全局的广播消息。
程序启动BroadcastReceiver需要两步:
1.创建需要启动的BroadcastReceiver的Intent;
2.调用Context的sendBroadcast()或sendOrderedBroadcast()方法来启动指定的BroadcastReceiver。
BroadcastReceiver本质上是监听器,所以实现它只要重写onReceive(Context context,Intent intent)方法即可。
接着要指定该BroadcastReceiver能匹配的Intent,有如下两种方式:
1、代码进行指定:
IntentFilter filter = new IntentFilter("com.example.android_broadcasttest.BROADCAST");
MyReceiver receiver = new MyReceiver();
registerReceiver(receiver,filter);
2、在manifest文件中进行配置:
<receiver android:name="com.example.android_broadcasttest.MyReceiver">
<intent-filter>
<action android:name="com.example.android_broadcasttest.BROADCAST"/>
</intent-filter>
</receiver>
注:不要在BroadcastReceiver的onReceive()方法中执行耗时操作,否则会造成ANR。如果确实需要根据Broadcast来完成一项耗时操作,可以考虑通过Intent启动一个Service来完成需要的操作。
简单实例(最基本的用法):界面放置一个按钮用来发送广播,接收到广播之后Toast显示。
public class MainActivity extends ActionBarActivity {
private Button sendBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sendBtn = (Button) findViewById(R.id.send_btn);
sendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建Intent对象
Intent intent = new Intent();
//设置Intent的Action属性
intent.setAction("com.example.android_broadcasttest.BROADCAST");
intent.putExtra("msg", "这是第一个简单的有序广播小案例~");
//发送广播
sendBroadcast(intent);
}
});
}
}
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, intent.getAction() + "------" + intent.getStringExtra("msg"), Toast.LENGTH_LONG).show();
}
}
<receiver android:name="com.example.android_broadcasttest.MyReceiver">
<intent-filter >
<action android:name="com.example.android_broadcasttest.BROADCAST"/>
</intent-filter>
</receiver>
广播分为两种,普通广播和有序广播。
普通广播可以被所有接收者接收到,消息传递的效率比较高。缺点是接收者不能将处理结果传递给下一个接收者,并且无法终止Broadcast Intent的传播。
有序广播的接收者按预先声明的优先级依次接收Broadcast。优先级的声明有两种方式,1,在<intent-filter>元素的android:priority属性中设置;2,代码中调用intentFilter对象的setPriority()方法进行设置(数越大,优先级越高)。有序广播可以终止Broadcast Intent的传播,一旦终止,后面的接收者将无法接收到广播。另外,有序广播接收者可以将数据传递给下一个接收者。
有序广播的发送:
sendOrderedBroadcast(intent,null);
有序广播接收者存放数据:
//创建一个Bundle对象,并存入数据
Bundle bundle = new Bundle();
bundle.putString("pre", "接收者的数据!");
//将bundle放入结果中
setResultExtras(bundle);
有序广播接收者终止广播:
abortBroadcast();
有序广播接收者解析上一个接收者所存入的数据:
Bundle bundle = getResultExtras(true);
//解析前一个接收者所存入的key为“pre”的消息
String result = bundle.getString("pre");