广播分类:

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

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

接收系统广播:

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

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

  1. public class MainActivity extends AppCompatActivity {
  2. private IntentFilter intentFilter;
  3. private NetworkChangeReceiver networkChangeReceiver;
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. intentFilter = new IntentFilter();
  9. //添加要接收的广播类型
  10. intentFilter.addAction("android.net.com.CONNECTIVITY_CHANGE");
  11. //创建广播接收者
  12. networkChangeReceiver = new NetworkChangeReceiver();
  13. //注册广播接收者
  14. registerReceiver(networkChangeReceiver,intentFilter);
  15. }
  16.  
  17. @Override
  18. protected void onDestroy() {
  19. super.onDestroy();
  20. //取消注册
  21. unregisterReceiver(networkChangeReceiver);
  22. }
  23.  
  24. //自定义广播接收者
  25. class NetworkChangeReceiver extends BroadcastReceiver{
  26.  
  27. @Override
  28. public void onReceive(Context context, Intent intent) {
  29. //收到广播后处理相关逻辑
  30. ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
  31. NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
  32. if(networkInfo != null && networkInfo.isAvailable()){
  33. Toast.makeText(context,"network is available",Toast.LENGTH_SHORT).show();
  34. }else {
  35. Toast.makeText(context,"network is unavailable",Toast.LENGTH_SHORT).show();
  36. }
  37.  
  38. }
  39. }
  40. }

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

  1.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  2.  
  3.  静态注册实现开机启动:(程序结束后还能正常接收广播)
      1.创建广播接收类:
        
  1. public class BootCompleteReceiver extends BroadcastReceiver {
  2. public BootCompleteReceiver() {
  3. }
  4.  
  5. @Override
  6. public void onReceive(Context context, Intent intent) {
  7.  
  8. }
  9. }

   2.在Manifest中静态注册:

  1.  
  2.    <receiver
  3. android:name=".BootCompleteReceiver"
  4. android:enabled="true"
  5. android:exported="true">
  6. <intent-filter>
  7. <action android:name="android.intent.action.BOOT_COMPLETED"/>
  8. </intent-filter>
  9. </receiver>
  10.     enable:是否启用广播接收器
  11.     exported:是否允许接收器接收本程序以外的广播
  12.     添加监听启动完成广播权限:
  13.       <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
  14.  

发送自定义广播:

  发送标准广播:

    1.首先定义广播接收器

  1.  
  1. public class MyBroadcastReceiver extends BroadcastReceiver {
  2.  
  3. @Override
  4. public void onReceive(Context context, Intent intent) {
  5.  
  6.   }
  7. }
  1.  
  1.    2.Manifest中注册:
      
  1.    
  1. <receiver
  2. android:name=".MyBroadcastReceiver"
  3. android:enabled="true"
  4. android:exported="true">
  5. <intent-filter>
  6. <action android:name="com.example.broadcast.MY_BROADCAST"/>
  7. </intent-filter>
  8. </receiver>
  1.   3.发送广播:
        
  1. public void onClick(View v) {
  2. if(v.getId() == R.id.send){
  3. Intent intent = new Intent("com.example.broadcast.MY_BROADCAST");
  4. sendBroadcast(intent);
  5. }
  6. }

  发送有序广播:

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

    

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

  

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

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

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

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

  1.创建广播接收器

  1.   class NetworkChangeReceiver extends BroadcastReceiver{
  2.  
  3. @Override
  4. public void onReceive(Context context, Intent intent) {
  5.  
  6. }
  7.  
  8. }
  9. }

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

    LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);

  3.注册广播接收器

    localBroadcastManager.registerReceiver(networkChangeReceiver,intentFilter);

  4.发送广播:

    localBroadcastManager.sendBroadcast(intent);

  5.注销广播

  1.    localBroadcastManager.unregisterReceiver(networkChangeReceiver);
  1.  

  

  1.  
  1.   
  2.  

  

  

了解BroadcastRecever的更多相关文章

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

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

随机推荐

  1. [redis] redis配置文件redis.conf的详细说明

    # Redis 配置文件 # 当配置中需要配置内存大小时,可以使用 1k, 5GB, 4M 等类似的格式,其转换方式如下(不区分大小写) # # 1k => bytes # 1kb => ...

  2. WPF+SignalR实现用户列表实时刷新

    原文:WPF+SignalR实现用户列表实时刷新 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lordwish/article/details/5 ...

  3. eclipse使用Hibernate tools反向工程插件遇到的几个问题

    1,在eclipse使用hibernate工具,生成hibernate配置文件时,可能会提示not parse ....xml错误 参见 加载本地dtd 2,反向工程中,生成配置文件时,一般要填写其默 ...

  4. Android 开发者工具

    30多个Android 开发者工具 文中部分工具是收费的,但是绝大多数都是免费的. FlowUp 这是一个帮助你跟踪app整体性能的工具,深入分析关键的性能数据如FPS, 内存, CPU, 磁盘, 等 ...

  5. matlab 高级函数 —— colfilt/blockproc (图像)矩阵的分块处理

    colfilt 执行功能与 blockproc/nlfilter 类似,但效率更高. B = colfilt(A,[m n],block_type,fun),block_type:distinct/s ...

  6. 【u114】旅行计划(12月你好)

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 小明要去一个国家旅游.这个国家有N个城市,编号为1-N,并且有M条道路连接着,小明准备从其中一个城市出 ...

  7. Java实现多文件压缩打包的方法

    package com.biao.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutpu ...

  8. MongoDB小结

    教程 MongoDB MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.MongoDB 旨在为WEB应用提供可扩展的 ...

  9. net平台的rabbitmq

    net平台的rabbitmq使用封装 前言 RabbitMq大家再熟悉不过,这篇文章主要整对rabbitmq学习后封装RabbitMQ.Client的一个分享.文章最后,我会把封装组件和demo奉上. ...

  10. 链表Linked List

    链表Linked List 1. 链表 数组是一种顺序表,index与value之间是一种顺序映射,以O(1)O(1)的复杂度访问数据元素.但是,若要在表的中间部分插入(或删除)某一个元素时,需要将后 ...