BroadcastReceiver又叫广播接收器,是Android四大组件之一。
注册方式:
1、动态注册,也就是在代码中进行注册,注册方式如下:
public class MainActivity extends AppCompatActivity {
private IntentFilter mIntentFilter;
private MyBroadcastReceive mMyBroadcastReceive;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mIntentFilter = new IntentFilter();
mIntentFilter.addAction("你自己定义或系统的Action");
mMyBroadcastReceive = new MyBroadcastReceive();
registerReceiver(mMyBroadcastReceive, mIntentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mMyBroadcastReceive);
}
}
优点:使用灵活,跟随所注册组件的生命周期变化。
缺点:在组件杀死前,必须移除广播接收器。
使用场景:需要在特定时刻监听广播。
2、静态注册
静态注册也就是在AndroidMenifest.xml文件中注册:
<receiver
android:name=".MyBroadcastReceive"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.yrf.broadcastreceivertest.myBroadcast" />
</intent-filter>
</receiver>
在AndroidMenifest中定义一个receiver字段即可,enabled表示是否启用这个广播接收器,exported表示是否允许接收其他应用程序发送的广播。
优点:常驻,不受任何组件的生命周期影响。
缺点:耗电,占内存。
使用场景:需要时刻监听广播。
发送方式:
1、标准广播:这是一种完全异步的广播,在广播发出之后,所有符合规则的广播接收器几乎都会在同一时刻接收到这条广播消息。发送标准广播使用sendBroadcast()方法。
2、有序广播:这是一种完全同步的广播,在广播发出之后,同一时刻只有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。广播接收器的传播先后顺序是根据优先级来的。发送有序广播使用sendOrderedBroadcast()方法。
优先级设置方法:在intentFilter中添加priority字段即可:
<receiver
android:name=".MyBroadcastReceive"
android:enabled="true"
android:exported="true"
>
<intent-filter android:priority="1000">
<action android:name="com.yrf.broadcastreceivertest.myBroadcast" />
</intent-filter>
</receiver>
本地广播:
本地广播是一种属于只能被本程序广播接收器接收的广播,使用方式如下:
public class MainActivity extends AppCompatActivity {
private IntentFilter mIntentFilter;
private MyBroadcastReceive mMyBroadcastReceive;
private LocalBroadcastManager mLocalBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mIntentFilter = new IntentFilter();
mIntentFilter.addAction("com.yrf.broadcastreceivertest.myBroadcast1");
mMyBroadcastReceive = new MyBroadcastReceive();
mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
mLocalBroadcastManager.registerReceiver(mMyBroadcastReceive, mIntentFilter);
findViewById(R.id.btn_send).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("com.yrf.broadcastreceivertest.myBroadcast1");
mLocalBroadcastManager.sendBroadcast(intent);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
mLocalBroadcastManager.unregisterReceiver(mMyBroadcastReceive);
}
}
注意:本地广播只能通过动态注册的方式来发送消息。
优点:1、保密性高。2、没有安全漏洞的隐患。3、比全局广播更加高效。
参考资料:第一行代码。