在开发Android的widget时,第一个需要解决的问题就是怎么实现让widget定时更新,在查阅比较多的资料后,一般情况用Service在后台更新,废话不多说,贴代码如下:

Widget:

public class NewsWidgetProvider extends AppWidgetProvider {@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {}@Overridepublic void onDisabled(Context context) {// TODO Auto-generated method stubsuper.onDisabled(context);}@Overridepublic void onEnabled(Context context) {// TODO Auto-generated method stubsuper.onEnabled(context);}@Overridepublic void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {NewsService.updateAppWidgetIds(appWidgetIds);context.startService(new Intent(context,NewsService.class));}public static RemoteViews updateAppWidget(Context context,List<RssNews> list) {RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.appwidget_layout);if (list.size() > 3) {views.setTextViewText(R.id.textView01, list.get(0).title);views.setTextViewText(R.id.textView02, list.get(1).title);views.setTextViewText(R.id.textView03, list.get(2).title);}Intent detailIntent=new Intent(context,NewsSiteList.class);PendingIntent pending=PendingIntent.getActivity(context, 0, detailIntent, 0);views.setOnClickPendingIntent(R.id.textView01, pending);views.setOnClickPendingIntent(R.id.textView02, pending);views.setOnClickPendingIntent(R.id.textView03, pending);return views;}@Overridepublic void onReceive(Context context, Intent intent) {super.onReceive(context, intent);}}

Service:

public class NewsService extends Service implements Runnable {private static final String TAG="NewsService"; private static Queue<Integer> sAppWidgetIds=new LinkedList<Integer>();public static final String ACTION_UPDATE_ALL = "com.xxxx.news.UPDATE_ALL";private static boolean sThreadRunning = false;private static Object sLock = new Object();@Overridepublic IBinder onBind(Intent intent) {return null;}public static void updateAppWidgetIds(int[] appWidgetIds){synchronized (sLock) {for (int appWidgetId : appWidgetIds) {sAppWidgetIds.add(appWidgetId);}}}public static int getNextWidgetId(){synchronized (sLock) {if (sAppWidgetIds.peek() == null) {return AppWidgetManager.INVALID_APPWIDGET_ID;} else {return sAppWidgetIds.poll();}}}private static boolean hasMoreUpdates() {synchronized (sLock) {boolean hasMore = !sAppWidgetIds.isEmpty();if (!hasMore) {sThreadRunning = false;}return hasMore;}}@Overridepublic void onCreate() {super.onCreate();}@Overridepublic void onStart(Intent intent, int startId) {super.onStart(intent, startId);if (null != intent) {if (ACTION_UPDATE_ALL.equals(intent.getAction())) {AppWidgetManager widget = AppWidgetManager.getInstance(this);updateAppWidgetIds(widget.getAppWidgetIds(new ComponentName(this, NewsWidgetProvider.class)));}}synchronized (sLock) {if (!sThreadRunning) {sThreadRunning=true;new Thread(this).start();}}}@Overridepublic void run() {SharedPreferences setting=getSharedPreferences("com.xxxx.news_preferences", 0);String updateTime=setting.getString("list_time", "1800000");String updateUrl=setting.getString("list_site", "xxxxxxxxx");AppWidgetManager appWidgetManager=AppWidgetManager.getInstance(this);RemoteViews updateViews=null;while (hasMoreUpdates()) {int appWidgetId=getNextWidgetId();List<RssNews> listNews = NewsContenttList.getNewsList(updateUrl);if (listNews != null) {updateViews = NewsWidgetProvider.updateAppWidget(this, listNews);}if (updateViews != null) {appWidgetManager.updateAppWidget(appWidgetId, updateViews);}}Intent updateIntent=new Intent(ACTION_UPDATE_ALL);updateIntent.setClass(this, NewsService.class);PendingIntent pending=PendingIntent.getService(this, 0, updateIntent, 0);Time time = new Time();long nowMillis = System.currentTimeMillis();time.set(nowMillis+Long.parseLong(updateTime));long updateTimes = time.toMillis(true);Log.d(TAG, "request next update at "+updateTimes);AlarmManager alarm=(AlarmManager)getSystemService(Context.ALARM_SERVICE);alarm.set(AlarmManager.RTC_WAKEUP, updateTimes, pending);stopSelf();}}本文转载自:http://www.oschina.net/question/5189_8939

更多相关文章

  1. 【源码分享下载】每日更新之Android应用源码之仿微信5.2布局
  2. Android(安卓)Studio——Android(安卓)Studio更新升级方法
  3. Android(安卓)Studio启动时出现unable to access android sdk ad
  4. Android: 如何利用Handler、Thread更新视图
  5. Android实现widget定时更新
  6. Android开发工具更新ADT23,AS0.8.13下载地址
  7. Android(安卓)Studio更新升级方法
  8. Android(安卓)媒体库数据更新
  9. Android开发面试经——4.常见Android进阶笔试题(更新中...)

随机推荐

  1. android 优秀博客的保存
  2. android自定义button样式
  3. Android Bitmap,Drawable, byte[]转化
  4. [转]Android(安卓)View体系(一)视图坐标系
  5. 修改Android自带Switch样式
  6. android 仿path半圆形菜单
  7. Android使用通讯录的权限问题
  8. android SmartTabLayout——自定义标题带
  9. Android -----listView的属性大全
  10. android 异常 汇总