BroadcastReceiver用于接收程序所发出的Broadcast Intent。程序启动BroadcastReceiver也只需要两步:
(1)创建需要启动的BroadcastReceiver的Intent
(2)调用Context的sendBroadcast()或者sendOrderedBroadcast()方法来启动指定的BroadcastReceiver。
当应用程序发出一个Broadcast Intent之后,所有匹配该Intent的BroadcastReceiver都有可能被启动。
BroadcastReceiver本质上属于一个系统级别的监听器,因此实现BroadcastRTeceiver的方法是:重写BroadcastReceiver的onReceive(Context context,Intent intent)方法注意的是,onReceive()方法不能在10秒内执行完成,Android会认为该程序无法响应,因此不要在onReceive()方法中执行耗时的操作。
简单的Demo
public class MainActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendBroadcast();
}
});
}
private void sendBroadcast(){
Intent intent = new Intent();
intent.setAction("hahaha");
intent.setPackage("com.example.zhaol.mybroadcastreceivr");
intent.putExtra("msg","简单的消息");
sendBroadcast(intent);
}
}
MyReceiver
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Toast.makeText(context,"接收到的消息的Action"+intent.getAction()+"接收到的消息"
+intent.getStringExtra("msg"),Toast.LENGTH_SHORT).show();
}
}
AndroidMainfest.xml
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="hahaha"/>
</intent-filter>
</receiver>
有序广播
Broadcast被分为两种:
(1)普通广播:完全异步的,可以同时被所有接收者接收到,效率高,但是缺点是不能处理结果传递到下一个接收者,并且无法终止Broadcast Intent的传播。
(2)有序广播:按照优先级来接收,通过元素的android:priority属性中,数越大优先级越高。也可以调用IntentFilter对象的setPriority()方法来设置。
两种方式发送广播;sendBroadcast()发送普通广播
sendOrderedBroadcast():发送有序广播,优先级高的可以调用BroadcastReceiver的abordBroadcast()方法终止Broadcast.
而且有序广播中优先接收到Broadcast的接收者可以通过setResultExtras(Bundle)方法奖处理结果存入到Broadcast中,然后传给下一个广播接收者,下一个接收者可以通过Bundle bundle = getResultExtras(true)得到上一个接收者存入的数据。
Mainactivity
private void sendBroadcast(){
Intent intent = new Intent();
intent.setAction("hahaha");
intent.setPackage("com.example.zhaol.mybroadcastreceivr");
intent.putExtra("msg","简单的消息");
sendOrderedBroadcast(intent,null);
}
AndroidMainfest.xml
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="20">
<action android:name="hahaha" />
</intent-filter>
</receiver>
<receiver
android:name=".MyReceiver2"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="0">
<action android:name="hahaha"/>
</intent-filter>
</receiver>
MyReceiver
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Toast.makeText(context,"接收到的消息的Action"+intent.getAction()+"接收到的消息"
+intent.getStringExtra("msg"),Toast.LENGTH_SHORT).show();
Bundle bundle = new Bundle();
bundle.putString("haha","第一个Broadcast存入的数据");
setResultExtras(bundle);
// abortBroadcast();//取消广播
}
}
MyReceiver2
public class MyReceiver2 extends BroadcastReceiver {
public MyReceiver2() {
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Bundle bundle = getResultExtras(true);
String first = bundle.getString("haha");
Toast.makeText(context,""+first,Toast.LENGTH_SHORT).show();
}
}
两种方式注册广播
(1)如上Demo,在AndroidMainfest.xml中
(2)
IntentFilter intent = new IntentFilter();
intent.setAction("xxx");
MyReceiver myReceiver = new MyReceiver();
registerReceiver(myReceiver , intent);