Android广播机制(1)
简介
就是因为安卓中的每个应用程序都可以对自己感兴趣的广播进行注册,这样改程序就只会接收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来自于其他应用程序的
发送广播和接收广播方式
发送广播: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)的更多相关文章
- Android随笔之——Android广播机制Broadcast详解
在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理.这个广播跟我们传统意义中的电台广播有些相似之处.之所以叫做广播,就 ...
- Android广播机制的深入学习
部分内容转载自http://www.cnblogs.com/lwbqqyumidi/p/4168017.html 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者 ...
- Android总结篇系列:Android广播机制
1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通 ...
- Android广播机制概述
1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通 ...
- Android广播机制:Broadcast
转载:Android总结篇系列:Android广播机制 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广 ...
- Android(java)学习笔记172:BroadcastReceiver之 Android广播机制
Android广播机制 android系统中有各式各样的广播,各种广播在Android系统中运行,当"系统/应用"程序运行时便会向Android注册各种广播.Android接收到广 ...
- Android广播机制(转)
1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通 ...
- Android广播机制
原文出处: Android总结篇系列:Android广播机制 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的 ...
- Android(java)学习笔记115:BroadcastReceiver之 Android广播机制
Android广播机制 android系统中有各式各样的广播,各种广播在Android系统中运行,当"系统/应用"程序运行时便会向Android注册各种广播.Android接收到广 ...
- Android广播机制简介
为什么说Android中的广播机制更加灵活呢?这是因为Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来 ...
随机推荐
- Supermarket POJ - 1456(贪心)
题目大意:n个物品,每个物品有一定的保质期d和一定的利润p,一天只能出售一个物品,问最大利润是多少? 题解:这是一个贪心的题目,有两种做法. 1 首先排序,从大到小排,然后每个物品,按保质期从后往前找 ...
- 一起了解 .Net Foundation 项目 No.24
.Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. Xamarin.Mobil ...
- git基本设置——git工具篇
1.设置邮箱和用户名 /*解释: --global 选项代表对 Git 进行全局设置.*/ $ git config --global user.name "Your Name" ...
- Sublime text 3快捷键壁纸版
- 大部分人都不知道的8个python神操作
01 print 打印带有颜色的信息 大家知道 Python 中的信息打印函数 Print,一般我们会使用它打印一些东西,作为一个简单调试. 但是你知道么,这个 Print 打印出来的字体颜色是可以设 ...
- SpringCloud-Alibaba-Nacos 服务注册中心&配置中心
Spring Cloud Alibaba 由于 Spring Cloud Netflix 项目进入维护模式(将模块置于维护模式意味着 Spring Cloud 团队将不会再向模块中添加新功能,只会修复 ...
- 解决laravel5.4视图不生效的坑
遇到这种坑,主要是路由的问题 1.看看是不是单词拼错了 Route::get('/posts/{post}','\App\Http\Controllers\PostController@show'); ...
- Docker网络与存储(三)
Docker的网络和存储 1.1 Docker的4种网络模式 host模式,使用--net=host指定. container模式,使用--net=container:NAME_or_ID指定. no ...
- js 实现淘宝无缝轮播图效果,可更改配置参数 带完整版解析代码[slider.js]
前言: 本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽. 本篇文章为您分析一下原生JS写淘宝无缝轮播图效果 需求分析: ...
- OpenWrt-19.07.2 For HC5861(极路由3) /HiWiFi/Gee最新固件,极路由3刷openwrt
OpenWrt For HiWiFi(HC5861) 自编译精减固件,极路由3自用固件 HC5861-uboot.bin v19.07.2 下载 支持 NTFS 读写 支持 Wi-Fi 5G 驱动 默 ...