|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
打开.xib的文件打开的就是IBIB和代码交互用的是IBActionIBOutlet这些标记这些标记追踪到他们的定义其实对编译器来说什么都不表示在前一篇文章中,我们已能够在文本时钟小部件上显现工夫,可是这个工夫没法主动更新。在本文中我们将会利用AlarmManager准时更新小部件。
之前,我们会商过IntentService和怎样利用它往实行Action。AlarmManager为我们供应了一个准时启动IntentService的完善机制。但愿本文能帮你懂得怎样利用Intent启动AndroidService(之前先容并利用过)。怎样设定AlarmManager在某段工夫距离后实行这个Action,而且能够选择工夫距离反复实行。不止范围于启动服务(Service),AlarmManager还能够实行很多别的Action。它能够发送播送并启动举动(Activity)。PendingIntent用来暗示将要被实行的Action,由AlarmManager布置这个Action将要实行的工夫。
让我们思索一下我们的使用小部件应该怎样更新。当用户在主页面创立一个小部件时会挪用TextClockAppWidget的onUpdate()办法。到今朝为止,我们只是在这个函数里更新小部件的工夫,没有做任何其他事变。但实在我们还能够在这个办法里布置行将要举行的更新。固然,我们仍旧但愿在这里更新初始工夫,以是我们坚持startService()稳定。我们但愿做的是天生一个Alarm,这个Alarm会每分钟触发一个PendingIntent,挪用一次startService()(事先间从59秒变到00秒的时分,分钟数加一)确保小部件显现准确的工夫。
有一点要注重,用户大概安装多个小部件实例。可是我们只必要一个Alarm更新。我们的时钟小部件原本就应当在统一工夫更新,因而启动多个服务就有些华侈了。坏动静是,AlarmManager不同意我们查询设置了哪些Alarm,这让事变变得有些庞大。好动静是,我们能够经由过程PendingIntent检测是不是有一个已设置的Alarm。即便是创立在分歧的线程、历程、乃至使用程序中,假如PendingIntent利用不异的操纵(Operation)、IntentAction、数据、分类、组件和标志(Flag),那它就是独一的PendingIntent。我们可使用它办理Alarm。
为了便于申明,我们重点存眷用PendingIntent来启动服务。一样的手艺也能够使用在其他场所。我们没法间接创立PendingIntent,可是PendingIntent类为我们供应了一些静态工场办法。PendingIntent.getService()可以承受四个参数:
- Contextcontext:PendingIntent启动的服务高低文。
- intrequestCode:疏忽。
- Intentintent:用作startService()的参数,此函数会在方才供应的context上挪用。
- intflags:用来把持是不是必要和怎样创立或更新PendingIntent。
假如我们利用FLAG_NO_CREATE标志,那末PendingIntent.getService()会反省是不是有一个带有一样参数的PendingIntent已存在于此设备上。假如存在前往它的实例,不然前往null。因而我们可使用这个办法确保只存在一个PendingIntent:
1
2
3
4
5
6
7
8
9
10
11
Intentupdate=newIntent(TextClockService.ACTION_UPDATE);
PendingIntentpi=PendingIntent.getService(context,
REQUEST_CODE,
update,
PendingIntent.FLAG_NO_CREATE);
if(pi==null){
pi=PendingIntent.getService(context,
REQUEST_CODE,
update,
PendingIntent.FLAG_CANCEL_CURRENT);
}
假如创立PendingIntent时只创立了一个Alarm,那就能够包管只要一个Alarm。
我们还能够使用于TextClockAppWidget:
<p>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
publicclassTextClockAppWidgetextendsAppWidgetProvider{
privatestaticfinalStringTAG="TextClockWidget";
privatestaticfinalIntentupdate=newIntent(TextClockService.ACTION_UPDATE);
privatestaticfinalintREQUEST_CODE=1;
privateContextcontext=null;
@Override
publicvoidonUpdate(Contextcontext,
AppWidgetManagerappWidgetManager,
int[]appWidgetIds){
Log.d(TAG,"onUpdate");
this.context=context;
this.context.startService(update);
scheduleTimer();
}
privatevoidscheduleTimer(){
Calendardate=Calendar.getInstance();
<p> |
|