標籤:arm ids hit ui組件 gets 服務 datetime appwidget 廣播
案頭時鐘之組件開發:
整個流程例如以下:
demo:www.github.com/xufeifandj
service+組件+廣播進行後台即時更新時間
(一)開機廣播監聽開機啟動service服務啟動後。馬上動態注冊一個廣播去監聽時間發生變化。
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_TIME_TICK); //時間發生改變
intentFilter.addAction(Intent.ACTION_TIME_CHANGED); //
intentFilter.addAction(Intent.ACTION_DATE_CHANGED); //日期改動
intentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED); //時區改動
this.getBaseContext().registerReceiver(widgetsUpdateReceiver, intentFilter);
(二) 廣播監聽到有時間發生改變,就可以進行更新群組件
class UpdateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
updateWidget();
}
}
//發送廣播去更新群組件就可以
public synchronized void updateWidget() {
sendBroadcast(new Intent("com.android.FERRIS_UPDATE_WIDGET"));
}
(3) WeatherWidget_time 繼承於 AppWidgetProvider事實上也是一個廣播。
我們在這裡注冊了一些更新的action
//組件發生改變時候。進行更新
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
for (int i = 0; i < appWidgetIds.length; i++) {
RemoteViews updateView = lewaBuildUpdate(context, appWidgetIds[i],false,true,true);
appWidgetManager.updateAppWidget(appWidgetIds[i], updateView);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
@Override
public void onReceive(final Context context, Intent intent) {
if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){//開機啟動
//啟動時間後台服務。動態去注冊廣播
Intent service=new Intent(context, WidgetTimeService.class);
context.startService(service);
updateTimeAlarm(context); //並去更新一下時鐘
}else if(intent.getAction().equals("com.android.FERRIS_UPDATE_WIDGET")){ //監聽到時間變化。更新wiget
updateTimeAlarm(context);
}
super.onReceive(context, intent);
}
(4)更新時間
public synchronized void updateTimeAlarm(Context context){
// AppWidgetManager appWidgetManger = AppWidgetManager
// .getInstance(context);
// int[] appIds = appWidgetManger.getAppWidgetIds(new ComponentName(
// context, WeatherWidgetV5_time.class));
//
ComponentName provider = new ComponentName(context,context.getPackageName()+ ".WeatherWidget_time");
AppWidgetManager gm = AppWidgetManager.getInstance(context);
int[] appWidgetIds;
appWidgetIds = gm.getAppWidgetIds(provider);
for (int i = 0; i < appWidgetIds.length; i++) { //遍曆進行更新
RemoteViews updateView = lewaBuildUpdate(context, appWidgetIds[i],false,true,true); //更新UI組件。參數為分別為日期 星期 等。是否更新
gm.updateAppWidget(appWidgetIds[i], updateView);
}
}
【天氣APP】之案頭時鐘witget組件