广播类型 标准广播 有序广播
标准广播:发出广播后所有接受这同时接受到
有序广播:广播发出后,同一时刻只有一个接受者能够收到广播,优先级高的先接收到,并且前面的接收者能够截断广播
广播是一种跨进程通信方式
广播接收器注册要接收的广播
广播的注册方式有两种 在代码中注册(动态注册) 在AndroidManifest中注册(静态注册)
eg动态注册监听网络变化
public class MainActivity extends Activity{
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//每当网络变化时,系统就会发出这样的一条广播
networkChangeReceiver = new NetWorkChangeReceiver();
registerReceiver(networkChangeReceiver,intentFilter);
}
@Override
protected void onDestory(){
super.onDestory();
unregisterReceiver(networkChangeReceiver);
}
class NetworkChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Content content,Intent intent){
Toast.makeText(context,"network changes",Toast.LENGTH_SHOOR).show
}
}
}
动态注册的广播必须取消注册才行
静态注册
动态注册的广播接收器可以自由控制注册与取消,在灵活性方面有很大优势,但是他的缺点是必须在程序运行候才能收到广播,静态注册可以做到这点。
eg
public class BootCompleteReceive extends BroadcastReceiver{
@Override
public void onReceive(Context context ,Intent intent){
Toast.makeText(Context,"Boot Complete",Toast.LENGTH_LONG).show();
}
}
在Androidmanifest注册
<receiver android : name = ".BootCompleteReceiver">
<intent-filter>
<action android : name = "android,intent,action,BOOT_COMPLETED"/>
</intent-filter>
</receiver>
发送标准广播
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
发有序广播
sendOrderdBroadcast(intent,null);
给广播接收器设置优先级
android priority = "100";
截断广播
abortBroadcast();
本地广播
使用LocalBroadcastManager对广播进行管理,并提供发送和注册广播接受器的方法
eg
public class MainActivity extands Activity{
private IntentFilter intentFilter;
private LocalReceiver localReceiver;
private LoalBroadcastManager localBraodcastManager;
@Override
protected void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
setContentView(...);
localBroadcastManager = LocalBraodcastManager.getInstance(this);
按钮的初始化部分省略
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST');
localBroadManager.sendBroadcast(intent);
intentFilter = new IntentFilrer();
intentFilter.addAction("...");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceivert(localReceiver,intentFilter);
}
@Override
protected void onDestory(){
super.onDestory();
localBroadcastManager.unregisterReceiver(localReceiver);
}
class LocalReceiver extends BroadcastReceiver{
@Override
public void onReceiver(Context context,Intent intent){
Toast.makeText(context,"received local broadcast",Toast.LENGTH_SHORT).show();
}
}
}
注意 本地广播无法通过静态注册的方式来接收
本地广播的优点
1.正在发送的广播不会离开我们的程序,不会泄露信息
2.其他的程序无法将广播送到我们的程序内部,不必担心安全漏洞
2.比全局广播高效