作为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
|
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页面:
静态广播对应第一个按钮,点击事件:
1
2
3
|
Intent intent =
new
Intent(
"com.google.broadcast.BookBroadCast.static"
);
intent.putExtra(
"Name"
,
"静态广播"
);
sendBroadcast(intent);
|
静态广播需要在AndroidManifest.xml中注册一下:
1
2
3
4
5
6
7
|
<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终止:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@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);
}
|
动态调用事件,对应第二个按钮:
1
2
3
|
Intent dintent =
new
Intent(
"com.google.broadcast.BookBroadCast.dymanic"
);
dintent.putExtra(
"Name"
,
"动态广播"
);
sendBroadcast(dintent);
|
结果如下:
两种系统广播调用方式
关于系统广播的各种事件网上一找一堆,我就没必要贴在这里了,先来实现第三个和第四个按钮的事件,第三个是系统事件的改变,第四个是电池电量的改变:
第三个action的常量的和Intent枚举出来的名称有出入:
1
|
<action android:name=
"android.intent.action.TIME_SET"
/>
|
调用的时候是这样的:
1
2
3
|
Intent sintent =
new
Intent(Intent.ACTION_TIME_CHANGED);
sintent.putExtra(
"Name"
,
"不被保护系统广播"
);
sendBroadcast(sintent);
|
结果如下:
这个其实都没有什么大的问题,然后按照静态注册方式没法搞定第四个电池电量的问题,先来看第四个是如何实现的:
1
2
3
|
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
本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4083288.html,如需转载请自行联系原作者