简介

就是因为安卓中的每个应用程序都可以对自己感兴趣的广播进行注册,这样改程序就只会接收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来自于其他应用程序的

发送广播和接收广播方式

发送广播:Intent

接收广播:广播接收器(Broadcast Receiver)

广播类型

标准广播:标准广播是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接受到这条广播消息。因此它们之间没有任何先后顺序可言,这种广播的效率比较高,但同时也意味着它是无法被截断的。

有序广播:有序广播则是一种同步执行广播,在广播发出之后,同一时刻只会有一个广播接收器能够接受到这条广播信息。但这个广播进入其中的逻辑执行完毕后,广播才会继续传递。所以此时的广播计数器是有先后顺序的,优先级高的广播接收器就可以先接受到广播消息,而且,并且前面的广播接收器还可以阶段正在传递的广播,这样后面的广播接收器就无法受到广播消息了。

接收系统广播

Android具有很多内置广播

注册广播的方式:

动态注册:在代码中注册

静态注册:在AndroidManifest.xml中注册


创建广播接收器

新建一个类继承自BroadcastReceiver->重写父类的onReceive()方法当有广播到来时,onReceive()方法就会执行,具体的逻辑可以在这个方法中处理。

动态注册监听网络变化

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.conn.CONNECTIVITY_CHANGE");//想监听什么广播就添加相应的action
networkChangeReceiver=new NetworkChangeReceiver();//广播接收器
registerReceiver(networkChangeReceiver,intentFilter);//注册
} @Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);//动态注册的广播必须取消注册
}
//广播接收器继承BroadcastReceiver这个类,每次接收到广播会调用onReceive()方法
class NetworkChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"network changes",Toast.LENGTH_SHORT).show();
}
}
}

步骤

1.注册广播:创建IntentFilter对象->添加广播对应的action

2.新建广播接收器继承自Broadcast类重写onReceive方法

3.registerReceiver注册广播,将IntentFilter对象和广播接收器实例对象传进去(这样广播和广播接收器的逻辑就绑定在一起了)

4.动态注册的广播一定记得取消注册unregisterReceiver

**注:Android系统为了保护用户设备的安全和隐私做了严格的规定,如果程序需要进行一些对于用户来说比较敏感的操作,就必须在配置文件中声明权限才可以,否则程序将会直接崩溃,比如这里访问系统的网络状态就是需要声明权限的。打开AndroidManifest.xml文件,加入以下代码,才可以访问系统网络状态:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcasttest">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
...
</manifest>

优化

告诉用户当前网络状态是可用还是不可用。修改MainActivity中的代码:

public class MainActivity extends AppCompatActivity {
...
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();
}
}
}
}

静态注册实现开机启动

动态注册广播接收器可以自由的控制注册与注销,在灵活性方面有很大的优势,但是它也存在着一个缺点即必须要在程序启动之后才能接受到广播,因为注册的逻辑写在onCreate方法中的

步骤

1.创建广播接收器的快捷方式:右击com.example.broadcasttest包->New->Other->Broadcast Receive.出现以下窗口后,Exported表示是否允许这个广播接收器接收本程序之外的广播,Enable表示是否启用这个广播接收器.



2.然后修改BootCompleteReceiver中的代码:

public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"Boot Complete",Toast.LENGTH_SHORT).show();
}
}

**注:静态注册的广播一定要在AndroidManifest.xml中注册(快捷方式已经帮我们完成了)标签,如下展示:

...
<application
...
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
...

注意

不要在onReceive()方法中添加过多的逻辑或者进行任何耗时的操作,在广播接收器中是不允许开启线程的,当onReceive()运行较长时间却没有结束时,程序就会保报错。因此,广播接收器更多的是扮演一种打开其他程序组件的角色,比如创建一条状态栏通知,或者启动一个服务。

Android广播机制(1)的更多相关文章

  1. Android随笔之——Android广播机制Broadcast详解

    在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理.这个广播跟我们传统意义中的电台广播有些相似之处.之所以叫做广播,就 ...

  2. Android广播机制的深入学习

    部分内容转载自http://www.cnblogs.com/lwbqqyumidi/p/4168017.html 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者 ...

  3. Android总结篇系列:Android广播机制

    1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通 ...

  4. Android广播机制概述

    1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通 ...

  5. Android广播机制:Broadcast

    转载:Android总结篇系列:Android广播机制 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广 ...

  6. Android(java)学习笔记172:BroadcastReceiver之 Android广播机制

    Android广播机制 android系统中有各式各样的广播,各种广播在Android系统中运行,当"系统/应用"程序运行时便会向Android注册各种广播.Android接收到广 ...

  7. Android广播机制(转)

    1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通 ...

  8. Android广播机制

    原文出处: Android总结篇系列:Android广播机制 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的 ...

  9. Android(java)学习笔记115:BroadcastReceiver之 Android广播机制

    Android广播机制 android系统中有各式各样的广播,各种广播在Android系统中运行,当"系统/应用"程序运行时便会向Android注册各种广播.Android接收到广 ...

  10. Android广播机制简介

    为什么说Android中的广播机制更加灵活呢?这是因为Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来 ...

随机推荐

  1. Joomla 3.4.6 RCE 分析

    Joomla 3.4.6 RCE 漏洞分析,首发先知社区: https://xz.aliyun.com/t/6522 漏洞环境及利用 Joomla 3.4.6 : https://downloads. ...

  2. 一个可能是世界上最全的 API 接口集合库开源项目

    对于程序员来说,为自己的程序选择一些合适的API并不是那么简单,有时候还会把你搞得够呛,今天猿妹要和大家分享一个开源项目,这个项目汇集了各种开发的api,涵盖了音乐.新闻.书籍.日历等,无论你是从事W ...

  3. Jetson AGX Xavier更换apt-get源

    使用apt-get安装时,会很慢,更换了国内的源后,就可以解决这个问题了. 1. 备份sources.list文件 sudo cp /etc/apt/sources.list /etc/apt/sou ...

  4. jstat命令查看JVM 的GC状态

    转载于   https://www.cnblogs.com/alter888/p/10407952.html jstat命令可以查看堆内存各部分的使用量,以及加载类的数量.命令的格式如下: jstat ...

  5. Python爬虫之记录一次下载验证码的尝试

      好久没有写过爬虫的文章了,今天在尝试着做验证码相关的研究时,遇到了验证码的收集问题.   一般,验证码的加载都有着比较复杂的算法和加密在里边,但是笔者今天碰到的验证码却比较幸运,有迹可循.在此,给 ...

  6. hdu_2570 迷障 贪心

    迷瘴 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  7. CtsVerifier-Bluetooth-LE-SEcure-ClientServer-Test测试pass但是无法选择passbutton

    [问题描述] CtsVerifier-Bluetooth-LE-SEcure-ClientServer-Test测试pass但是无法选择Pass-Button 工具版本:9.0-r11 其他信息: 上 ...

  8. 无法打开到SQL Server的连接 (Microsoft SQL Server, 错误:53) .

    标题: 连接到服务器 ------------------------------ 无法连接到 MSSQLSERVER. ------------------------------ 其他信息: 在与 ...

  9. MySQL重新初始化安装数据库

     删除./mysql/var下的所有数据后,怎么重新安装初始数据库? (1)进入./mysql/bin目录下,执行脚本./mysql_install_db: (2)执行完(1)后,此时会在./mysq ...

  10. C++如何求程序运行时间

    C++中常用clock()函数求运行时间,返回值类型为clock_t,返回值是程序运行到本次调用clock()函数经过的clock数,头文件为<time.h>. 用法: 1.求开始时间s= ...