广播分类:

  标准广播(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. Linux下用GCC

    Linux下用GCC 前言 离职前对做过的支付系统进行了一番#总结,继续完善我的C服务器. 本想着接下来大概实现一下 CGI 协议,但是实现过程中被一个问题卡住了: C进程与php进程的交互数据类型问 ...

  2. Babel与Polyfill的关系和区别

    很多同学搞不清楚babel与polyfill的关系以及区别,这儿给大家细致解惑. Babel:Babel 是一个广泛使用的 ES6 转码器,可以将 ES6 代码转为 ES5 代码.注意:Babel 默 ...

  3. android studio中文乱码各种情况的解决办法

    情况一:编辑器内的中文注释乱码. 解决办法:在界面的右下角找到 UTF-8 ,单击之,在弹出的列表中选中GBK 在弹出框内选中Reload 总结:导致这样的原因是你这个.java文件本身是GBK编码的 ...

  4. No USB devices or running emulators detected”

    每次重装系统之后,安装andorid studio后,使用真机调试代码,就会出现"No USB devices or running emulators detected"的错误, ...

  5. 【63.63%】【codeforces 724A】Checking the Calendar

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  6. WPF 自定义控件的坑(蠢的:自定义控件内容不显示)

    原文:WPF 自定义控件的坑(蠢的:自定义控件内容不显示) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/koloumi/article/detai ...

  7. yii2.0预先处理方法

    public function beforeAction($action){ return $action; }

  8. twemproxy分片处理原理--剖析twemproxy代码正编

    twemproxy在redis上能处理多命令流程只有mset,mget,del的命令,例如mset的话是mset k1 v1 k2 v2 k3 k3,mget的话是mget k1 k2 k3,del的 ...

  9. Linux性能测试 ss命令

    ss即socket state,也就是说,是可以查看系统中socket的状态的.我们可以用netstat,但为什么还要用ss这个工具呢,当然ss也是有好处的.当我们打开的socket数量很多时,net ...

  10. java程序设计第二课

    抽象基类和接口 能够使用keywordabstact来创建抽象类,该抽象类不能被实例化 也能够使用keywordabstact来描写叙述一个尚未被详细实现的方法,该方法不能包括方法体 一个抽象方法仅仅 ...