Android之路-------传说中的大喇叭(广播接收器)
前言
没想到离上一篇博文的时间已经有一个多星期了,时间真的不等人啊,在这里LP告诉你们一个道理,如果现在有谁正在看管理时间的书,那么请你们把这些书放下吧,看了也没有用,因为时间我们根本管不了,我们只能管自己,如果真的想管时间,错了,应该是珍惜时间的话,那么请你们要和时间做朋友,介绍一本书给大家看《和时间做朋友》 作者是 李笑来。 不说废话了,广播开始了
目录
- 什么是广播
- 广播的种类
- 怎么去使用这些广播
- 最安全的广播
什么是广播?
广播相信有上过学的人都知道,在学校里面都有那么一个大喇叭,通知大家起床做早操,通知大家去上课,通知大家够时间吃饭了等等一些,这种就是广播,其实Android中的广播原理就是这样,只是性质不一样而已。
广播的种类
1.标准广播
它是一种完全异步执行的广播,一旦发出后,所有的接收器在同一时间内接收到这个广播,没有任何顺序可言
这种广播效率比较高,在效率高的同时也意味着它是无法被截断的
直接上图
2.有序广播
它是一种同步执行的广播,在广播发出之后,同一时间内只有一个广播接收器接收到,当这个广播接收器的逻辑执行完了才会继续传播,所以这种广播机制是有优先级的,优先级越高就可以最先接收到广播,同样的道理,优先级高,自然也可以截断广播不让广播继续传下去。
直接上图

怎么去使用这些广播
要使用这些广播那么就必须要注册,说到注册广播,Android系统提供了两种注册机制。
1.动态注册
动态注册的话,直接调用registerReceiver()方法就可以注册了,但是在活动销毁的时候必须要调用unregisterReceiver()方法取消注册。
虽说动态注册广播接收器,可以自由的控制,在灵活性方面有很大的优势,但是有一个缺点,就是必须要在程序启动之后才能接收到广播。
代码如下:
public class MainActivity extends Activity {
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");
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) {
Toast.makeText(context, "network changes", Toast.LENGTH_SHORT)
.show();
}
}
}
2.静态注册
上面介绍了动态注册广播接收器,相信你们自然会注意到,动态注册只能在程序启动后才能接受广播,那么你们肯定会有疑问,那怎么才能让程序已启动就能接受到呢?没错下面LP要介绍的这种方式就能解决你们的疑问,而且注册非常简单。下面我就写一个开机广播吧...
首先创建一个类,然后继承BroadcastReceiver,代码如下
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();
}
}
然后在项目的根目录下的AndroidManifest.xml文件的Application标签下配置:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcasttest"
android:versionCode="1"
android:versionName="1.0" > <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name=".BootCompleteReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application> </manifest>
注意写开机广播接收器需要在清单文件中添加开机权限。
我们的逻辑业务代码都是卸载onReceive这个方法里面就可以了。
广播接收介绍完了,那么到底我们可不可以自己发广播呢,答案是肯定的....我们又怎么去发广播呢?
其实发广播非常简单,代码如下:
/**
* 自定义广播接收器,接收自己发送的广播
*/
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received in MyBroadcastReceiver",
Toast.LENGTH_SHORT).show();
}
}
接收器写好了,不过还需要在AndroidManifest.xml文件中定义:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcasttest"
android:versionCode="1"
android:versionName="1.0" > <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name=".MyBroadcastReceiver" >
<intent-filter>
<action android:name="com.example.broadcasttest. MY_BROADCAST" />
</intent-filter>
</receiver>
</application> </manifest>
好了,都准备完了,这时候我们就可以写发送广播的代码了:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(
"com.example.broadcasttest. MY_BROADCAST");
sendBroadcast(intent);
}
});
}
}
点击按钮就可以成功的发送广播了,是不是非常简单。。其实要注意的就是 Intent()里的 com.example.broadcasttest. MY_BROADCAST 和 AndroidManifest.xml文件里定义的广播接收器配置中intent-filter中的 <action android:name="com.example.broadcasttest. MY_BROADCAST" /> 一直就可以了
前面介绍到,有两种广播的,那么我们怎么去区分呢,其实也是很简单的,只是在发送广播的时候用的方法不一样,
发送标准广播,即不可截断的广播用 sendBroadcast(intent)方法
发送有序广播,即可截断的广播用 sendOrderBroadcast(intent,null)方法
最安全的广播
那么最安全的广播是什么广播呢?
那就是本地广播,为什么说最安全呢?因为通过这种广播机制发出的广播,只能够在应用程序的内部传递数据,且广播接收器也只能接受来自本应用的广播。而前面我们介绍的广播,都是全局广播,反正在同一个手机,应用程序发送出去的广播,别的程序都可以接收到,我们也可以接收到别的程序发来的广播。这样很容易产生安全漏洞,所以说本地广播是最安全的。
如何去使用呢?
通过LocalBroadcastManager的getInstance()方法得到它的一个失礼,然后调用LocalBroadcastManager的registerReceiver注册一个广播接收器,而在发送本地广播的时候调用LocalBroadcastManager的sendBroadcast()方法就可以了,非常简单...
代码如下:
public class MainActivity extends Activity {
private IntentFilter intentFilter;
private LocalReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
localBroadcastManager = LocalBroadcastManager.getInstance(this); // 获取实例
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(
"com.example.broadcasttest. LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent); // 发送本地广播
}
});
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter); // 注册本地广播监听器
}
@Override
protected void onDestroy() {
super.onDestroy();
localBroadcastManager.unregisterReceiver(localReceiver);
}
class LocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received local broadcast",
Toast.LENGTH_SHORT).show();
}
}
}
小结
在不知不觉中,我们已经学了Android四大组件的两个组件了,后面我还会将我学到的一一分享,写到这里来。
关于广播接收器的重点都介绍完了,大家有没有觉得很难? 或者说有没有发现LP哪里写的不对,如果有的话,麻烦各位博友,动一下手指头在下面点评一下LP。如果觉得LP写的还不错的话,麻烦也动下鼠标帮我点个赞,你们的点赞是我的动力啊
Android之路-------传说中的大喇叭(广播接收器)的更多相关文章
- Android基础总结(4)——广播接收器
在Android中的每个应用程序可以对自己感兴趣的广播进行注册,这样该程序就只会接收自己所关心的广播内容,这些广播可能来自于系统的,也可能来自于其他应用程序的.Android提供了一整套完整的API, ...
- Android应用程序注册广播接收器(registerReceiver)的过程分析
前 面我们介绍了Android系统的广播机制,从本质来说,它是一种消息订阅/发布机制,因此,使用这种消息驱动模型的第一步便是订阅消息:而对 Android应用程序来说,订阅消息其实就是注册广播接收器, ...
- Android学习总结(五)———— BroadcastReceiver(广播接收器)的基本概念和两种注册广播方式
我们学完了Android四大组件的Activity和Service了,接下来我们一起来学习Android四大组件的第三个吧:BroadcastReceiver(广播接收者),计划如下图: 一.Broa ...
- Xamarin.Android广播接收器与绑定服务
一.前言 学习了前面的活动与服务后,你会发现服务对于活动而言似乎就是透明的,相反活动对于服务也是透明的,所以我们还需要一中机制能够将服务和活动之间架起一座桥梁,通过本节的学习,你将会学到广播与绑定服务 ...
- Android -- 简单广播接收与发送(2)--动态注册广播接收器
1. 效果图
- Android安全问题 抢先接收广播 - 内因篇之广播接收器注册流程
导读:本文说明系统是如何注册动态广播以及静态广播,这里主要注意其注册的顺序 这篇文章主要是针对我前两篇文章 android安全问题 抢先开机启动 - 结果篇 android安全问题 抢先拦截短信 ...
- android在广播接收器BroadcastReceiver里面再进行发送广播,造成当前广播接收器不断循环执行问题
最近在公司处理项目时,用到锁屏状态弹出activity进行提示,类似QQ消息弹屏提示的功能.当中用到了,假如该弹出activity已经位于锁屏界面外时,将不进行再次弹窗,而是发送广播进行通知数据更新, ...
- Android组件系列----BroadcastReceiver广播接收器
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- Android应用程序注冊广播接收器(registerReceiver)的过程分析
前面我们介绍了Android系统的广播机制,从本质来说,它是一种消息订阅/公布机制,因此,使用这样的消息驱动模型的第一步便是订阅消息:而对Android应用程序来说,订阅消息事实上就是注冊广播接收器, ...
随机推荐
- html contenteditable
contenteditable 是html中的一個屬性,在HTML中,某些元素設置 contenteditable='true' 屬性時可以開啟該元素的編輯模式,contenteditable 可以 ...
- eclipse不能识别虚拟机的问题
1.输入cmd进入dos界面,进入android-sdk-windows\platform-tools目录,执行下面命令启动adb start-server出现下面错误* daemon not run ...
- yii phpexcel <转>
原文详情参见 这里 1.下载phpexcel,将压缩包中的classes复制到protected/extensions下并修改为PHPExcel. 2.修改YII配置文件config/main.php ...
- (转)解析PHP中ob_start()函数的用法
本篇文章是对PHP中ob_start()函数的用法进行了详细的分析介绍,需要的朋友参考下 ob_start()函数用于打开缓冲区,比如header()函数之前如果就有输出,包括回车/空格/换行 ...
- android中百度地图定位的实现方法(仅适用于真机+WIFI联网环境)
注意:此代码的环境是:真机(系统版本为Android4.2.2)+WIFI联网(才能实现最后的运行结果):使用虚拟机调试会出现各种问题. 第一步:下载SDK和申请Key 到百度的网站http://de ...
- App Store审核指南(中文版)2010版
前言 感谢您付出宝贵的才华与时间来开发iOS应用程程序.从职业与报酬的角度而言,这对于成千上万的开发员来说一直都是一项值得投入的事业.我们希望帮助您加入这个成功的组织.这是我们首次发布<应用程序 ...
- Swift - 33 - 返回函数类型和函数嵌套
//: Playground - noun: a place where people can play import UIKit /*---------------------------返回函数类 ...
- 通过Unity依赖注入
前言 Unity容器的思想起始于我在为Web Client Sofitware Factory项目工作的时候,微软的patterns&practices团队已经使用依赖注入的概念好几年了在那时 ...
- openssl 使用非阻塞 bio
序 在项目中需要访问 https 加密的网页,为了保证并发性,需要用到非阻塞的 socket,搜索发现,这种使用场景的相关介绍不是很多,所以这里记录一下使用的过程. 在项目中,所使用的 ssl 库是老 ...
- socket (转,吴秦,http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html)
Linux Socket编程(不限Linux)2010-12-12 21:58 by 吴秦 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web ...