广播分类:

  标准广播(Normal broadcasts):完全异步执行的广播,接收没有先后顺序,效率高,无法被接收器被拦截。

  有序广播(Ordered broadcasts) :同步执行的广播,有先后顺序,广播可以被接收器拦截或修改。

接收系统广播:

  动态注册监听网络变化:(只能在程序启动后才能接收到广播,程序结束,广播取消)

    1.再activity中注册广播并处理接收后的逻辑

public class MainActivity extends AppCompatActivity {
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.com.CONNECTIVITY_CHANGE");
//创建广播接收者
networkChangeReceiver = new NetworkChangeReceiver();
//注册广播接收者
registerReceiver(networkChangeReceiver,intentFilter);
} @Override
protected void onDestroy() {
super.onDestroy();
//取消注册
unregisterReceiver(networkChangeReceiver);
} //自定义广播接收者
class NetworkChangeReceiver extends BroadcastReceiver{ @Override
public void onReceive(Context context, Intent intent) {
//收到广播后处理相关逻辑
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if(networkInfo != null && networkInfo.isAvailable()){
Toast.makeText(context,"network is available",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(context,"network is unavailable",Toast.LENGTH_SHORT).show();
} }
}
}

    2.还要添加访问网络状态的权限:

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

 静态注册实现开机启动:(程序结束后还能正常接收广播)
  1.创建广播接收类:
    
public class BootCompleteReceiver extends BroadcastReceiver {
public BootCompleteReceiver() {
} @Override
public void onReceive(Context context, Intent intent) { }
}

   2.在Manifest中静态注册:

 
   <receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
    enable:是否启用广播接收器
    exported:是否允许接收器接收本程序以外的广播
    添加监听启动完成广播权限:
      <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
 

发送自定义广播:

  发送标准广播:

    1.首先定义广播接收器


public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
public void onReceive(Context context, Intent intent) {   }
}

   2.在Manifest中注册:
  
   
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.broadcast.MY_BROADCAST"/>
</intent-filter>
</receiver>
  3.发送广播:
    
public void onClick(View v) {
if(v.getId() == R.id.send){
Intent intent = new Intent("com.example.broadcast.MY_BROADCAST");
sendBroadcast(intent);
}
}

  发送有序广播:

    1.在注册广播接收器时给intent-filter设置优先级属性,数值越大,优先级越高

    

<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter
android:priority="100">
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
   2.发送有序广播:
    
    Intent intent = new Intent("com.example.broadcast.MY_BROADCAST");
sendOrderedBroadcast(intent,null);//只需要修改发送方法
  3.接收到广播时进行拦截或者修改处理:
    
public class BootCompleteReceiver extends BroadcastReceiver {
public BootCompleteReceiver() {
} @Override
public void onReceive(Context context, Intent intent) {
abortBroadcast();//拦截广播
setResult(int code,Stirng data, Bundle extras);//修改结果传递给下一个广播
//获取上一个广播传来的数据
getResultCode();
getResultData();
getResultExtras(boolean makeMap);
}
}

  

   4.终结广播(不管是否拦截,都会最终执行)

    Intent intent = new Intent("com.example.broadcast.MY_BROADCAST");

    sendOrderedBroadcast(intent,null,new BootCompleteReceiver(),new Handler(),0,null,null);

使用本地广播:
  本地广播只能在应用内部传递

  1.创建广播接收器

  class NetworkChangeReceiver extends BroadcastReceiver{

        @Override
public void onReceive(Context context, Intent intent) { } }
}

  2.获取本地广播管理类:

    LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);

  3.注册广播接收器

    localBroadcastManager.registerReceiver(networkChangeReceiver,intentFilter);

  4.发送广播:

    localBroadcastManager.sendBroadcast(intent);

  5.注销广播

   localBroadcastManager.unregisterReceiver(networkChangeReceiver);

  

 
  

  

  

了解BroadcastRecever的更多相关文章

  1. android获取周围AP信息(下)

    疑问: 在上一篇中,还有一个问题未解决:WifiManager的startscan() 方法是立即返回的,也就是说这个方法会调用一个扫描wifi信号的线程,那么这个扫描什么时候结束呢?我们又该什么时候 ...

随机推荐

  1. matlab 运行 AlexNet

    0. alexnet 工具箱下载 下载地址:Neural Network Toolbox(TM) Model for AlexNet Network 需要先注册(十分简单),登陆,下载: 下载完成之后 ...

  2. 设置storyboard拉伸属性

  3. WPF入门(四)->线形区域Path内容填充之渐变色(LinearGradientBrush)

    原文:WPF入门(四)->线形区域Path内容填充之渐变色(LinearGradientBrush) 前面我们介绍到,Path对象表示一个用直线或者曲线连接的图形,我们可以使用Path.Data ...

  4. 百度UEditor上传图片-再再总结一次

    本周,CSDN有个网友遇到了百度UEditor上传问题,最后商定付50元钱,我帮他解决这个问题.    他最初想自己搞定这个问题,结果搞了好多次,好几天,还是没能解决.    2015年1月17日8: ...

  5. linux下Java程序中插入DB中国的数据乱码问题

    首先,插入到DB数据,在Linux在查询时,现场展示??. 再次,在windows连接到db上,查看的结果并非乱码. 改动Eclipse软件中的编码:如上图:windows菜单->prefere ...

  6. CentOS 配置epel源

    先查询下有没有epel rpm -qa|grep epel 没有的话到官网https://fedoraproject.org/wiki/EPEL下载rpm包 然后 rpm -ivh 安装 安装完毕后到 ...

  7. Excel、记事本数据导入到数据库

    将手机号批量导入数据库.思路:先将要导入的文件传上项目里,然后读取文件的每行数据并插入数据库,操作完后再将上传的文件删除 文件示例: Excel: 记事本:   前台代码: <div class ...

  8. Information centric network (icn) node based on switch and network process using the node

    The present invention relates to an apparatus for supporting information centric networking. An info ...

  9. 重设windows10中的sub linux系统用户密码

    原文:重设windows10中的sub linux系统用户密码 版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/haiyoung/article/detai ...

  10. 【翻译自mos文章】对于每个文件的 file.id and file.incarnation number,重命名文件别名

    对于每个文件的 file.id and file.incarnation number,重命名文件别名 參考原文: Rename Alias of Datafile as Per file.id an ...