天天看点

Android组件之BroadCast简单实践

作为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页面:

Android组件之BroadCast简单实践

静态广播对应第一个按钮,点击事件:

<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>&lt;receiver android:name=</code><code>"com.google.broadcast.BookBroadCast"</code><code>&gt;</code>

<code>         </code><code>&lt;intent-filter &gt;</code>

<code>             </code><code>&lt;action android:name=</code><code>"com.google.broadcast.BookBroadCast.static"</code><code>/&gt;</code>

<code>                </code><code>&lt;action android:name=</code><code>"android.intent.action.TIME_SET"</code><code>/&gt;</code>

<code>         </code><code>&lt;/intent-filter&gt;</code>

<code>     </code><code>&lt;/receiver&gt;</code>

  结果如下:

Android组件之BroadCast简单实践

动态调用就是不需要在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>

  结果如下:

Android组件之BroadCast简单实践

关于系统广播的各种事件网上一找一堆,我就没必要贴在这里了,先来实现第三个和第四个按钮的事件,第三个是系统事件的改变,第四个是电池电量的改变:

第三个action的常量的和Intent枚举出来的名称有出入:

<code>&lt;action android:name=</code><code>"android.intent.action.TIME_SET"</code><code>/&gt;</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>

Android组件之BroadCast简单实践

这个其实都没有什么大的问题,然后按照静态注册方式没法搞定第四个电池电量的问题,先来看第四个是如何实现的:

<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,结果如下:

Android组件之BroadCast简单实践

这个问题解决都弄了一个多小时,最终的Google的API找到对应的解释:

地址:http://developer.android.com/reference/android/content/Intent.html#ACTION_TIME_TICK

Android组件之BroadCast简单实践

本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4083288.html,如需转载请自行联系原作者

继续阅读