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

静态广播对应第一个按钮,点击事件:
<code>Intent intent = </code><code>new</code> <code>Intent(</code><code>"com.google.broadcast.BookBroadCast.static"</code><code>);</code>
<code> </code><code>intent.putExtra(</code><code>"Name"</code><code>, </code><code>"静态广播"</code><code>);</code>
<code> </code><code>sendBroadcast(intent);</code>
静态广播需要在AndroidManifest.xml中注册一下:
<code><receiver android:name=</code><code>"com.google.broadcast.BookBroadCast"</code><code>></code>
<code> </code><code><intent-filter ></code>
<code> </code><code><action android:name=</code><code>"com.google.broadcast.BookBroadCast.static"</code><code>/></code>
<code> </code><code><action android:name=</code><code>"android.intent.action.TIME_SET"</code><code>/></code>
<code> </code><code></intent-filter></code>
<code> </code><code></receiver></code>
结果如下:
动态调用就是不需要在AndroidManifest.xml注册,在程序中动态生成filter设置action,在activity中的onStart注册,onStop终止:
<code>@Override</code>
<code>protected</code> <code>void</code> <code>onStop() {</code>
<code> </code><code>// TODO Auto-generated method stub</code>
<code> </code><code>super</code><code>.onStop();</code>
<code> </code><code>unregisterReceiver(bookReceiver);</code>
<code>protected</code> <code>void</code> <code>onStart() {</code>
<code> </code><code>super</code><code>.onStart();</code>
<code> </code><code>IntentFilter intentFilter = </code><code>new</code> <code>IntentFilter();</code>
<code> </code><code>intentFilter.addAction(</code><code>"com.google.broadcast.BookBroadCast.dymanic"</code><code>);</code>
<code> </code><code>bookReceiver = </code><code>new</code> <code>BookBroadCast();</code>
<code> </code><code>registerReceiver(bookReceiver, intentFilter);</code>
动态调用事件,对应第二个按钮:
<code>Intent dintent = </code><code>new</code> <code>Intent(</code><code>"com.google.broadcast.BookBroadCast.dymanic"</code><code>);</code>
<code> </code><code>dintent.putExtra(</code><code>"Name"</code><code>, </code><code>"动态广播"</code><code>);</code>
<code> </code><code>sendBroadcast(dintent);</code>
结果如下:
关于系统广播的各种事件网上一找一堆,我就没必要贴在这里了,先来实现第三个和第四个按钮的事件,第三个是系统事件的改变,第四个是电池电量的改变:
第三个action的常量的和Intent枚举出来的名称有出入:
<code><action android:name=</code><code>"android.intent.action.TIME_SET"</code><code>/></code>
调用的时候是这样的:
<code>Intent sintent = </code><code>new</code> <code>Intent(Intent.ACTION_TIME_CHANGED);</code>
<code> </code><code>sintent.putExtra(</code><code>"Name"</code><code>, </code><code>"不被保护系统广播"</code><code>);</code>
<code> </code><code>sendBroadcast(sintent);</code>
这个其实都没有什么大的问题,然后按照静态注册方式没法搞定第四个电池电量的问题,先来看第四个是如何实现的:
<code>IntentFilter systemintentFilter = </code><code>new</code> <code>IntentFilter(Intent.ACTION_BATTERY_CHANGED);</code>
<code> </code><code>systembookReceiver = </code><code>new</code> <code>BookBroadCast();</code>
<code> </code><code>registerReceiver(systembookReceiver, systemintentFilter);</code>
首先可以看出不是静态注册的,需要动态注册,然后不需要调用sendBroadcast,结果如下:
这个问题解决都弄了一个多小时,最终的Google的API找到对应的解释:
地址:http://developer.android.com/reference/android/content/Intent.html#ACTION_TIME_TICK
本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4083288.html,如需转载请自行联系原作者