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应用程序来说,订阅消息事实上就是注冊广播接收器, ...
随机推荐
- 如何设置jsp默认的编码为utf-8
方法一: 文件里写: <%@ page contentType="text/html; charset=UTF-8" %> 方法二: 选择window –> P ...
- Python下载漫画
上午起来提不起劲,于是就用电脑看漫画,但是在线看漫画好烦,就想下下来看.一个一个点太麻烦,于是花了点时间用python写了个demo,把爱漫画的漫画下载下来,这样就可以随时随地看了.这也是我首次尝试用 ...
- Linux shell入门基础(八)
八.shell脚本sed&awk 01.sed的使用 流编辑器-Steam Editor #ed /etc/passwd 1,10p …… 1s/root/byf/p(替换root为byf) ...
- Day6 - Python基础6 面向对象编程
Python之路,Day6 - 面向对象学习 本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发 ...
- noip 2012 疫情控制
/* 考试的时候没想出正解 也没打暴力 时间不够了 随便yy了几种情况按出现的先后顺序处理而没有贪心 的了20分 不粘了 正解是围绕首都的儿子来搞的 显然先二分答案 对于每个限定的最大时间 我们尝试着 ...
- .NET使用js验证服务器控件
<asp:TextBox ID="txtName" runat="server" Width="150px" CssClass=&qu ...
- 解决Windows8前面板耳机无声的问题
Windows8已经到来不久了,相信很多朋友已经在使用,在使用时也许会遇到前面板耳机无声的问题,网上的其他办法很麻烦还不一定能解决,在这里我会给大家提供最简单的办法解决这个问题. 百度经验:jingy ...
- SQL UPDATE 经典
1 sql中用另一个表的一列来更新数据库表 SELECT TOP 1000 [a] ,[b] ,[c] FROM [单元测试项目].[dbo].[A] SELECT TOP 1000 [a] ,[b] ...
- 重拾C++ 基础知识总结(二)
1.标准库string类型: 用户程序要使用string类型对象,必须包含相关头文件 #include <string> 字符串字面值与标准库string类型不是同一种类型,字符串字面值是 ...
- 【HAOI2011】向量
[题目描述] 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个 ...