广播分类
- 标准广播(Normal broadcasts):异步执行,广播发出后,所有广播接收器几乎同时收到。不可截断。
- 有序广播(Ordered broadcasts):同步执行,广播发出后,按照优先级顺序接收,同一时刻只有一个广播接收器能够收到。可截断。
注册方式
- 动态注册:
在Activity代码中注册,程序运行时有效。在代码中指定IntentFilter,然后添加相应的Action。动态注册的广播需使用unregisterReceiver取消注册。
//自定义一个BroadcastReceiver,在onReceive()方法中完成广播要处理的事务
public class MyBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(
context,"网络状态发生改变~",Toast.LENGTH_SHORT).show();
}
}
public class MainActivity extends AppCompatActivity {
MyBroadcastReceiver myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//核心部分代码:
myReceiver = new MyBroadcastReceiver ();
IntentFilter itFilter = new IntentFilter();
itFilter.addAction(
"android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(myReceiver, itFilter);
}
//别忘了将广播取消掉哦~
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
}
}
- 静态注册:即在AndroidManifest.xml文件中注册,程序未启动时仍可监听。
//自定义一个BroadcastReceiver,重写onReceive完成事务处理
public class BootCompleteReceiver extends BroadcastReceiver {
private final String
ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
if (ACTION_BOOT.equals(intent.getAction())){
Toast.makeText(context,
"开机完毕~",
Toast.LENGTH_LONG).show();
}
}
}
//在AndroidManifest.xml中对该BroadcastReceiver进行注册,添加相应的intent-filter
<receiver android:name=".BootCompleteReceiver">
<intent-filter>
<action android:
name = "android.intent.cation.BOOT_COMPLETED">
</intent-filter>
</receiver>
<!-- 权限 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
发送广播
标准广播和有序广播都是先设定Intent对象的action,再发送广播,但两者调用的方法不同。
标准广播,直接调用Context的sendBroadcast()方法:
sendBroadcast(intent);
有序广播,调用Context的sendOrderedBroadcast()方法:
//receiverPermission为指定接收权限的字符串
sendOrderedBroadcast(Intent intent, String receiverPermission)
此外,有序广播的接收器需要在内指定优先级,并且可以在某一接收器内调用abortBroadcast()进行截断。