BrocastReceiver是一个全局监听器,用于监听系统全局的广播信息,实现系统中不同组件之间的通信。
指定BroadcastReceiver()能匹配的Intent,有两种方式:
1. 在配置文件中指定。
<receiver android:name=".MyReceiver">
<intent-filter>
<!-- 指定该BroadcastReceiver所响应的Intent的Action -->
<action android:name="org.lynxw.action.CRAZY_BROADCAST" />
</intent-filter>
</receiver>
2. 在代码中指定。
//创建IntentFilter
IntentFilter filter = new IntentFilter();
filter.addAction("org.lynxw.action.CRAZY_BROADCAST");
registerReceiver(receiver,filter);
每一次系统Broadcast事件发生后,系统就会自动创建对应的BrocastReceiver实例,并自动触发onReceive()方法。
如果BrocastReceiver的onReceive()方法在10秒内不能执行完成,会弹出ANR对话框。
如果需要完成比较耗时的操作,可以考虑通过Intent启动一个Service来完成操作
发送广播
public class MainActivity extends Activity
{
Button send;
MyReceiver receiver = new MyReceiver();
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获取程序界面中的按钮
send = (Button) findViewById(R.id.send);
//创建IntentFilter
IntentFilter filter = new IntentFilter();
filter.addAction("org.lynxw.action.CRAZY_BROADCAST");
registerReceiver(receiver,filter);
send.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// 创建Intent对象
Intent intent = new Intent();
// 设置Intent的Action属性
intent.setAction("org.lynxw.action.CRAZY_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();
}
}
2. 有序广播
<receiver android:name=".MyReceiver">
<intent-filter android:priority="20">
<action android:name="org.crazyit.action.CRAZY_BROADCAST" />
</intent-filter>
</receiver>
<receiver android:name=".MyReceiver2">
<intent-filter android:priority="0">
<action android:name="org.crazyit.action.CRAZY_BROADCAST" />
</intent-filter>
</receiver>
public class MainActivity extends Activity
{
Button send;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获取程序中的send按钮
send = (Button) findViewById(R.id.send);
send.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// 创建Intent对象
Intent intent = new Intent();
intent.setAction("org.crazyit.action.CRAZY_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 bundle = new Bundle();
bundle.putString("first", "第一个BroadcastReceiver存入的消息");
// 将bundle放入结果中
setResultExtras(bundle);
// 取消Broadcast的继续传播
//abortBroadcast(); // ①
}
}
public class MyReceiver2 extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Bundle bundle = getResultExtras(true);
// 解析前一个BroadcastReceiver所存入的key为first的消息
String first = bundle.getString("first");
Toast.makeText(context, "第一个Broadcast存入的消息为:"
+ first, Toast.LENGTH_LONG).show();
}
}