广播主要分为两种类型:标准广播(完全异步执行的广播)和有序广播(完全同步执行的广播)。我们也可以根据广播是否可以跨进程接收,将广播分为:系统全局广播和本地广播
- 系统全局广播:发出的广播可以被其他任何程序接收到,并且我们也可以接收来自其他任何应用程序的广播
- 本地广播:发出的广播只能在应用程序的内部进行传递,广播接收器也只能接收本应用程序发出的广播
发送系统全局广播
- 标准广播
发送广播借助的是Intent
对象,使用的是Context对象的sendBroadcast()
方法发送广播。
代码实现:
//构建一个Intent对象,传入要传递的广播
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
//调用sendBroadcast方法发送出标准广播
sendBroadcast(intent);
- 有序广播
发送有序广播和发送标准广播思路基本一致,发送有序广播时,调用的是Context对象的sendOrderedBroadcast()方法:
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
//发送有序广播,第二个参数是与权限相关的字符串,传入null即可
sendOrderedBroadcast(intent, null);
发送有序广播时,进程接收广播是有顺序的,并且可以劫持广播,设置广播接收优先级:在配置文件中配置<receiver>
标签时,给<intent-filter>
标签添加属性"android:priority="xxx""
,实现拦截广播,调用方法:abortBroadcast()
发送本地广播
发送本地广播主要使用LocalBroadcastManager来对广播进行管理,并提供了发送广播和注册广播接收器的方法
代码实现:
public class MainActivity extends Activity {
private IntentFilter intentFilter;
private LocalReceive localReceive;
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取到LocalBroadcastManager实例对象
localBroadcastManager = LocalBroadcastManager.getInstance(this);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//创建Intent对象,指定广播内容
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
//发送本地广播
localBroadcastManager.sendBroadcast(intent);
}
});
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
localReceive = new LocalReceive();
//注册本地广播接收器
localBroadcastManager.registerReceiver(localReceive, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//动态注册,同样需要取消注册广播
localBroadcastManager.unregisterReceiver(localReceive);
}
class LocalReceive extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received local broadcast", Toast.LENGTH_SHORT).show();
}
}
}
本地广播是无法通过静态注册的方式来接收的,因为静态注册主要就是为了让程序在未启动的情况下也能收到广播,而发送本地广播时,我们的程序肯定已经启动了