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才是最可靠的,也搜了不少中文文章,就不信没人遇到坑,哎,周六看博客的都是爱学习的孩子,周末愉快~
最新文章
- adb server is out of date. killing...
- at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- css3渐变(Gradients)
- 东大OJ-1430-PrimeNumbers
- oracle11g 拆分字符串的详细技巧
- Java异常分类
- linux小包集合
- HBase入门
- 转】Maven学习总结(四)——Maven核心概念
- POJ3592 Instantaneous Transference题解
- MySQL-InnoDB引擎
- LODOP中的纯文本和超文本打印项
- linux系统运维命令
- 一道关于:ArrayList、Vector、LinkedList的存储性能和特性 的面试题
- python之lambda函数/表达式
- 关于 Azure Windows VM 的磁盘和 VHD
- 「Django」浏览+1的操作
- Shiro:授权控制
- 设置ADB网络连接目标板
- QPixmap 显示大小
热门文章
- Object-c和Java中的代理
- HP电脑的增霸卡功能操作详解
- 【递推】Codeforces Round #483 (Div. 2) [Thanks, Botan Investments and Victor Shaburov!] D. XOR-pyramid
- php发送get、post请求的6种方法代码示例
- hdu 1394 Minimum Inversion Number 逆序数/树状数组
- 移动端适配之雪碧图(sprite)背景图片定位
- (转,学习记录)MD5加密算法中的加盐值(SALT)
- gridview DataFormatString 属性设置须知
- 在Linux下使用sprintf代替atoi实现整型转化为char*
- 《TCP/IP具体解释卷2:实现》笔记--IP:网际协议