简介

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

发送广播和接收广播方式

发送广播: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. F - Robot Motion 栈加BFS

    A robot has been programmed to follow the instructions in its path. Instructions for the next direct ...

  2. 远程登录redis

    没想到吧,我居然已经摸到了redis. 远程登录redis redis-cli -h 127.0.0.1 -p 6379 ip地址和端口记得换成自己的

  3. 不同目录有同名proto文件情况下,protoc生成.cc/.h

    首先先参考一下别人的博客,看完了,看懂了,再回过头来看我下面说的情况. 链接 https://blog.csdn.net/CAir2/article/details/78201572 但是这个也就是基 ...

  4. 使用mysqlbinlog查看二进制日志

    (一)mysqlbinlog工具介绍 binlog类型是二进制的,也就意味着我们没法直接打开看,MySQL提供了mysqlbinlog来查看二进制日志,该工具类似于Oracle的logminer.my ...

  5. Category、load、initialize 源码讲解

    今天深圳天气有暴风雨,没有事情干,趁着周末和平常晚上写一篇关于Category知识的梳理!可能针对平常只会知道些category基本结论知道的人有些帮助,写这篇博客会按照下面的目录结合实例以及Cate ...

  6. Des对称可逆加密

    /// <summary> /// DES AES Blowfish ///  对称加密算法的优点是速度快, ///  缺点是密钥管理不方便,要求共享密钥. /// 可逆对称加密  密钥长 ...

  7. socket小计

    socket,是一个实现了双向通信的链接. 将http比喻为轿车,承载数据.传递数据,那么socket,就是轿车的发动机,它轿车动起来.

  8. python学习笔记(一)---字符串与列表

    字符串的一些处理 字符串的大小写 name="lonmar hb" print(name.upper())#全大写 print(name.lower())#全小写 print(na ...

  9. 2019-2020-1 20199329《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...

  10. LaTex中文article模板(支持代码、数学、TikZ)

    代码 请使用XeLatex编译 main.tex \documentclass{article} \usepackage{ctex} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...