刚开始做东西得时候很不了解android中一些组件的应用方法,找了一个闹钟的小例子来更好的理解广播的接收.
应用程序的界面是这样的,这个例子是用闹钟的制定与解除来穿插broadcast Receiver 的知识,不说废话了,先看下应用程序的界面:
![1 1]()
点击设定闹钟的按钮,弹出来一个设置时间的对话框,你选择时间之后会弹出一个Toast告诉你定的时间时多少,然后到时间之后弹出对话框提示时间到。先看图:
![2 2]()
![3 3]()
![4 4]()
是一个小闹钟的完整过程,代码中关键的部分就是用到AlarmManager控制时间和PendingIntent 捕获要执行的广播,先贴代码再详细讲解代码。
1
mButton1
.
setOnClickListener(
new
View
.
OnClickListener()
2
{
3
public
void
onClick(View
v)
4
{
/*
取得按下按钮时的时间做为TimePickerDialog的默认值
*/
5
c
.
setTimeInMillis(System
.
currentTimeMillis());
6
startCalendar
.
setTimeInMillis(System
.
currentTimeMillis());
7
int
mHour
=
c
.
get(Calendar
.
HOUR_OF_DAY);
8
int
mMinute
=
c
.
get(Calendar
.
MINUTE);
/*
跳出TimePickerDialog来设定时间
*/
9
new
TimePickerDialog(SetAlarmActivity
.
this
,
10
new
TimePickerDialog
.
OnTimeSetListener()
11
{
12
public
void
onTimeSet(TimePicker
view,
int
hourOfDay,
13
int
minute)
14
{
/*
取得设定后的时间,秒跟毫秒设为0
*/
15
c
.
setTimeInMillis(System
.
currentTimeMillis());
16
c
.
set(Calendar
.
HOUR_OF_DAY,
hourOfDay);
17
c
.
set(Calendar
.
MINUTE,
minute);
18
c
.
set(Calendar
.
SECOND,
0
);
19
c
.
set(Calendar
.
MILLISECOND,
0
);
20
Intent
intent
=
new
Intent(SetAlarmActivity
.
this
,
21
CallAlarm
.
class
);
22
PendingIntent
sender
=
PendingIntent
.
getBroadcast(
23
SetAlarmActivity
.
this
,
0
,
intent,
0
);
24
AlarmManager
am;
25
am
=
(AlarmManager)
getSystemService(ALARM_SERVICE);
26
am
.
set(AlarmManager
.
RTC_WAKEUP,
c
.
getTimeInMillis(),
27
sender);
/*
更新显示的设定闹钟时间
*/
28
String
tmpS
=
format(hourOfDay)
+
"
:
"
+
format(minute);
29
setTime1
.
setText(tmpS);
/*
以Toast提示设定已完成
*/
30
Toast
.
makeText(SetAlarmActivity
.
this
,
"
设定闹钟时间为
"
+
tmpS,
31
Toast
.
LENGTH_SHORT)
.
show();
32
33
}
34
}
,
mHour,
mMinute,
true
)
.
show();
35
}
36
}
);
代码中显示了当点击按钮之后所进行的代码处理,我们获得了设置的时间,然后用了一个Intent,用了一个pendIntent,这个PendIntent在捕获广播的时候才会启动,然后我们将这个PendIntent绑定到AlarmManager上面,有三个参数,一个是时间格式,一个是响铃的时间,一个是闹铃到期时启动sender这个PendIntent对象,然后启动绑定在PendIntent里面的intent,从而启动广播CallAlarm。
在广播接收器CallAlar中,并不是直接执行代码,广播接收器只有一个onReceive方法,在这个方法里面又启动了另外一个Activity。需要说明的是广播接收器是没有界面的.
1
package
com
.
cz;
/*
import相关class
*/
2
3
import
android
.
content
.
Context;
4
import
android
.
content
.
Intent;
5
import
android
.
content
.
BroadcastReceiver;
6
import
android
.
os
.
Bundle;
/*
调用闹钟Alert的Receiver
*/
7
8
public
class
CallAlarm
extends
BroadcastReceiver
9
{
10
@Override
11
public
void
onReceive(Context
context,
Intent
intent)
12
{
/*
create
Intent,调用AlarmAlert.class
*/
13
Intent
i
=
new
Intent(context,
AlarmAlert
.
class
);
14
Bundle
bundleRet
=
new
Bundle();
15
bundleRet
.
putString(
"
STR_CALLER
"
,
"
"
);
16
i
.
putExtras(bundleRet);
17
i
.
addFlags(Intent
.
FLAG_ACTIVITY_NEW_TASK);
18
context
.
startActivity(i);
19
}
20
}
启动另外一个Activity,是弹出闹铃时间到时的提示对话框,看下代码:
1
package
com
.
cz;
/*
import相关class
*/
2
3
import
android
.
app
.
Activity;
4
import
android
.
app
.
AlertDialog;
5
import
android
.
content
.
DialogInterface;
6
import
android
.
os
.
Bundle;
7
8
public
class
AlarmAlert
extends
Activity
9
{
10
@Override
11
protected
void
onCreate(Bundle
savedInstanceState)
12
{
13
super
.
onCreate(savedInstanceState);
/*
跳出的闹铃警示
*/
14
new
AlertDialog
.
Builder(AlarmAlert
.
this
)
.
setIcon(R
.
drawable
.
clock)
15
.
setTitle(
"
闹钟响了!!
"
)
.
setMessage(
"
赶快起床吧!!!
"
)
.
setPositiveButton(
16
"
关掉他
"
,
new
DialogInterface
.
OnClickListener()
17
{
18
public
void
onClick(DialogInterface
dialog,
19
int
whichButton)
20
{
/*
关闭Activity
*/
21
AlarmAlert
.
this
.
finish();
22
}
23
}
)
.
show();
24
}
25
}
如果条件允许,还可以在响铃时加上震动,铃声等选项..
本文转自HDDevTeam 51CTO博客,原文链接:http://blog.51cto.com/hddev/628428,如需转载请自行联系原作者