BroadcasetReceiver本质是一种全局监听器,监听系统级的广播消息,拥有自己的进程;而各种OnXXXListenser是程序级的监听器,只运行在程序所在的进程中,当程序退出时,OnXXXListenser随之关闭。
BroadcasetReceiver用于接收程序所发出的Broadca Intent,启动只需要要两步:
1、创建需要启动BroadcasetReceiver的Intent
2、调用Context的sendBroadcast()或sendOrderedBroadcast()方法启动指定的BroadcasetReceiver。
实现BroadcasetReceiver的方法重写BroadcasetReceiver的onReceive(Context, context, Intent intent)方法即可。
还要配置该BroadcasetReceiver能匹配的Intent,两种配置方式:代码指定或者在AndroidManifest.xml文件中配置。
如果BroadcasetReceiver的onReceive()方法在10秒内不能执行完成,Android会认为该程序无响应,也不要在onReceive()内执行耗时操作,否则会造成ANR结果。
下面是使用示例:
点击按钮,发送一条广播,以Toast形式展示接收到的广播消息。代码如下:
public class MainActivity extends Activity {
Button send;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
send = (Button) findViewById(R.id.send);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("com.yy.action.BROADCAST");
intent.putExtra("msg","简单消息");
sendBroadcast(intent);
}
});
}
}
在清单文件中配置:public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"接收到的Intent的Action"+ intent.getAction()+ "\n消息内容:"+intent.getStringExtra("msg"),Toast.LENGTH_LONG).show(); } }
<receiver android:name=".MyReceiver"> <intent-filter> <action android:name="com.yy.action.BROADCAST"></action> </intent-filter> </receiver>
Broadcast分为普通广播(Normal Broadcast)和有序广播(Ordered Broadcast),普通广播是完全异步的,能被所有接收者接收,但接收者不能把处理结果传递下一个接收者,且无法终止Broadcast Intent的传播。有序广播是按优先级(在<intent-filter>android:priority属性设置)依次接收,优先接收者可以把处理结果setResultExtras(Bundle)传递给下一个接收者,且可以终止传播.接收者通过Bundle bundle = getResultExtras(true)获取数据。
发送有序广播使用示例:
Activity中代码:
两个Receiver代码:send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setAction("com.yy.action.BROADCAST"); intent.putExtra("msg","这是一条广播"); sendOrderedBroadcast(intent,null); } });
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"接收到的Intent的Action"+ intent.getAction()+ "\n消息内容:"+intent.getStringExtra("msg"),Toast.LENGTH_LONG).show(); Bundle bundle = new Bundle(); bundle.putString("first","第一个接收者存入的消息:你好"); setResultExtras(bundle); } }
public class MyReceiver2 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = getResultExtras(true); String result = bundle.getString("first"); Toast.makeText(context,"广播内容:"+intent.getStringExtra("msg")+ "\n"+result, Toast.LENGTH_LONG).show(); } }
配置文件:<receiver android:name=".MyReceiver"> <intent-filter android:priority="20"> <action android:name="com.yy.action.BROADCAST"></action> </intent-filter> </receiver> <receiver android:name=".MyReceiver2"> <intent-filter android:priority="10"> <action android:name="com.yy.action.BROADCAST"></action> </intent-filter> </receiver>
若要取消继续传播,则调用abortBroadcast()即可。