【天气APP】之桌面时钟witget组件

 桌面时钟之组件开发:

整个流程如下:

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);
}
}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。