桌面时钟之组件开发:

整个流程例如以下:

下载地址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);
}
}