Android组件之BroadCast简单实践
作为Android的四大组件之一,没有理由不介绍一下BroadCast,BroadCast中文简单翻译就是广播,前阵子浙江某大学的啦啦操,广场舞的大妈,其中大妈和学生从喇叭和音响上听到的声音就是事件源,接收者就是这些大妈和学生,程序源自实践,Android中BroadCast,有事件广播者也有事件接收者,Broadcast是一种广泛运用的在应用程序之间传输信息的机制,BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件,也就是接收者。讲完了基本的概念,可以开始基本的实践:
自定义广播的两种实现方式
两种实现方式,一种是静态,一种是动态,先看下静态的实现过程:
定义一个BookBroadCast接收者(有几个判断添加是系统广播需要的):
public class BookBroadCast extends BroadcastReceiver {
private String tag = "BookBroadCast";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String actionString = intent.getAction();
String name = intent.getStringExtra("Name");
if (actionString.equals(Intent.ACTION_TIME_CHANGED)) {
Log.i(tag, "Name:" + name + "--Action:" + actionString
+ "--哥们,时间改变了~");
} else if (actionString.equals(Intent.ACTION_BATTERY_CHANGED)) {
Log.i(tag, "Name:" + name + "--Action:" + actionString
+ "--哥们,电量变了~");
} else {
Log.i(tag, "Name:" + name + "--Action:" + actionString);
}
}
}
看下App页面:

静态广播对应第一个按钮,点击事件:
Intent intent = new Intent("com.google.broadcast.BookBroadCast.static");
intent.putExtra("Name", "静态广播");
sendBroadcast(intent);
静态广播需要在AndroidManifest.xml中注册一下:
<receiver android:name="com.google.broadcast.BookBroadCast">
<intent-filter >
<action android:name="com.google.broadcast.BookBroadCast.static"/>
<action android:name="android.intent.action.TIME_SET"/>
</intent-filter>
</receiver>
结果如下:

动态调用就是不需要在AndroidManifest.xml注册,在程序中动态生成filter设置action,在activity中的onStart注册,onStop终止:
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
unregisterReceiver(bookReceiver);
} @Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.google.broadcast.BookBroadCast.dymanic");
bookReceiver = new BookBroadCast();
registerReceiver(bookReceiver, intentFilter); }
动态调用事件,对应第二个按钮:
Intent dintent = new Intent("com.google.broadcast.BookBroadCast.dymanic");
dintent.putExtra("Name", "动态广播");
sendBroadcast(dintent);
结果如下:

两种系统广播调用方式
关于系统广播的各种事件网上一找一堆,我就没必要贴在这里了,先来实现第三个和第四个按钮的事件,第三个是系统事件的改变,第四个是电池电量的改变:
第三个action的常量的和Intent枚举出来的名称有出入:
<action android:name="android.intent.action.TIME_SET"/>
调用的时候是这样的:
Intent sintent = new Intent(Intent.ACTION_TIME_CHANGED);
sintent.putExtra("Name", "不被保护系统广播");
sendBroadcast(sintent);
结果如下:

这个其实都没有什么大的问题,然后按照静态注册方式没法搞定第四个电池电量的问题,先来看第四个是如何实现的:
IntentFilter systemintentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
systembookReceiver = new BookBroadCast();
registerReceiver(systembookReceiver, systemintentFilter);
首先可以看出不是静态注册的,需要动态注册,然后不需要调用sendBroadcast,结果如下:

这个问题解决都弄了一个多小时,最终的Google的API找到对应的解释:
地址:http://developer.android.com/reference/android/content/Intent.html#ACTION_TIME_TICK

遇到问题发现Google才是最可靠的,也搜了不少中文文章,就不信没人遇到坑,哎,周六看博客的都是爱学习的孩子,周末愉快~
Android组件之BroadCast简单实践的更多相关文章
- Android组件化探索与实践
什么是组件化 不用去纠结组件和模块语义上的区别,如果模块间不存在强依赖且模块间可以任意组合,我们就说这些模块是组件化的. 组件化的好处 实现组件化本身就是一个解耦的过程,同时也在不断对你的项目代码进行 ...
- Android 设计随便说说之简单实践(合理组合)
上一篇(Android 设计随便说说之简单实践(模块划分))例举了应用商店设计来说明怎么做模块划分.模块划分主要依赖于第一是业务需求,具体是怎么样的业务.应用商店则包括两个业务,就是向用户展示appl ...
- Android组件化框架设计与实践
在目前移动互联网时代,每个 APP 就是流量入口,与过去 PC Web 浏览器时代不同的是,APP 的体验与迭代速度影响着用户的粘性,这同时也对从事移动开发人员提出更高要求,进而移动端框架也层出不穷. ...
- android四大组件之Broadcast
广播的概念 现实中:我们常常使用电台通过发送广播发布消息,买个收音机,就能收听 Android:系统在产生某个事件时发送广播,应用程序使用广播接收者接收这个广播,就知道系统产生了什么事件.Androi ...
- 使用Broadcast实现android组件之间的通信 分类: android 学习笔记 2015-07-09 14:16 110人阅读 评论(0) 收藏
android组件之间的通信有多种实现方式,Broadcast就是其中一种.在activity和fragment之间的通信,broadcast用的更多本文以一个activity为例. 效果如图: 布局 ...
- 使用Broadcast实现android组件之间的通信
android组件之间的通信有多种实现方式,Broadcast就是其中一种.在activity和fragment之间的通信,broadcast用的更多本文以一个activity为例. 效果如图: 布局 ...
- 【Android开发日记】之入门篇(六)——Android四大组件之Broadcast Receiver
广播接受者是作为系统的监听者存在着的,它可以监听系统或系统中其他应用发生的事件来做出响应.如设备开机时,应用要检查数据的变化状况,此时就可以通过广播来把消息通知给用户.又如网络状态改变时,电量变化时都 ...
- Android组件化最佳实践 ARetrofit原理
ARetrofit原理讲原理之前,我想先说说为什么要ARetrofit.开发ARetrofit这个项目的思路来源其实是Retrofit,Retrofit是Square公司开发的一款针对Android网 ...
- Android 组件化最佳实践 ARetrofit 原理
本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/TXFt7ymgQXLJyBOJL8F6xg作者:朱壹飞 ARetrofit 是一款针对Android ...
随机推荐
- 解决命令行运行python文件,出现No module named *** 报错问题
有时候在一个项目中运行的时候,可能是之前已经mark成sources root 你自己忘记了, 于是就在命令行也执行python文件,然后就出现 No module named *** 等 相关你认为 ...
- Mysql自增语句
一.创建查询 二.将 alter table `表名` change id id int not null auto_increment UNIQUE;复制进去(以id为例) 三.运行ok 注意:手动 ...
- Intellij IDEA Cannot resolve symbol XXX 问题解决办法汇总
maven项目遇到这类问题基本上是两方面的原因,类对应的依赖没有加载进来.编译器自身的设置和缓存问题. 解决第一类:1.检查项目的pom文件,是否必要的依赖都写清楚了: 2.是否使用自己的私有库,&l ...
- .NET常用的异常类型及其中文说明
基异常类型: 类 说明 System.Exception 所有异常的基类型 System.ApplicationException 发生非致命应用程序错误时引发的异常 System.SystemExc ...
- 灵活的按键处理程序 FlexibleButton
前言 正好工作中用到按键处理,需要处理单击.长按等按键事件,然后就造了这么一个轮子,为了以后更方便地加入其它的项目中使用,遂将其开源到 GitHub 中. 后面发现 RT-Thread 软件包里也有一 ...
- java面试数据类型
1. Java的数据类型? 2. Java的封装类型? 3. 基本类型和封装类型的区别? 基本类型只能按值传递,而对应的封装类是按引用传递的. 基本类型是在堆栈上创建的,而所有的对象类型都是在堆上创建 ...
- [python 源码]整数对象的创建和维护
刚开始学python时候,发现一个很迷惑的现象,一直到看了源码后才知道了: >>> a=6 >>> b=6 >>> a is b True 想用同 ...
- android 视频
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 第一套完整版: 第二套完整版: 第三套完整版: 第四套完整版: 第五套完整版: ==== ...
- 读书笔记_Effective_C++_条款三十三:避免遮掩继承而来的名称
名称的遮掩可以分成变量的遮掩与函数的遮掩两类,本质都是名字的查找方式导致的,当编译器要去查找一个名字时,它一旦找到一个相符的名字,就不会再往下去找了,因此遮掩本质上是优先查找哪个名字的问题. 而查找是 ...
- GIT 详解2
https://segmentfault.com/a/1190000000738398 http://www.cnblogs.com/cposture/p/4903767.html https://g ...