Android实现widget定时更新

 在开发Android的widget时,第一个需要解决的问题就是怎么实现让widget定时更新,在查阅比较多的资料后,一般情况用Service在后台更新,废话不多说,贴代码如下:
Widget:
Java代码 复制代码  收藏代码
  1. public class NewsWidgetProvider extends AppWidgetProvider {   
  2.   
  3.   
  4.     @Override  
  5.     public void onDeleted(Context context, int[] appWidgetIds) {   
  6.     }   
  7.   
  8.     @Override  
  9.     public void onDisabled(Context context) {   
  10.         // TODO Auto-generated method stub   
  11.         super.onDisabled(context);   
  12.     }   
  13.   
  14.     @Override  
  15.     public void onEnabled(Context context) {   
  16.         // TODO Auto-generated method stub   
  17.         super.onEnabled(context);   
  18.     }   
  19.   
  20.     @Override  
  21.     public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {   
  22.   
  23.         NewsService.updateAppWidgetIds(appWidgetIds);   
  24.         context.startService(new Intent(context,NewsService.class));   
  25.     }   
  26.        
  27.     public static RemoteViews updateAppWidget(Context context,List<RssNews> list) {   
  28.         RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.appwidget_layout);   
  29.         if (list.size() > 3) {   
  30.             views.setTextViewText(R.id.textView01, list.get(0).title);   
  31.             views.setTextViewText(R.id.textView02, list.get(1).title);   
  32.             views.setTextViewText(R.id.textView03, list.get(2).title);   
  33.         }   
  34.   
  35.         Intent detailIntent=new Intent(context,NewsSiteList.class);   
  36.            
  37.         PendingIntent pending=PendingIntent.getActivity(context, 0, detailIntent, 0);   
  38.         views.setOnClickPendingIntent(R.id.textView01, pending);   
  39.         views.setOnClickPendingIntent(R.id.textView02, pending);   
  40.         views.setOnClickPendingIntent(R.id.textView03, pending);   
  41.         return views;   
  42.     }   
  43.        
  44.     @Override  
  45.     public void onReceive(Context context, Intent intent) {   
  46.         super.onReceive(context, intent);   
  47.     }   
  48.   
  49. }  
public class NewsWidgetProvider extends AppWidgetProvider {


	@Override
	public void onDeleted(Context context, int[] appWidgetIds) {
	}

	@Override
	public void onDisabled(Context context) {
		// TODO Auto-generated method stub
		super.onDisabled(context);
	}

	@Override
	public void onEnabled(Context context) {
		// TODO Auto-generated method stub
		super.onEnabled(context);
	}

	@Override
	public 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;
	}
	
	@Override
	public void onReceive(Context context, Intent intent) {
		super.onReceive(context, intent);
	}

}


Service:
Java代码 复制代码  收藏代码
  1. public class NewsService extends Service implements Runnable {   
  2.        
  3.     private static final String TAG="NewsService";    
  4.   
  5.     private static Queue<Integer> sAppWidgetIds=new LinkedList<Integer>();   
  6.        
  7.     public static final String ACTION_UPDATE_ALL = "com.xxxx.news.UPDATE_ALL";   
  8.        
  9.     private static boolean sThreadRunning = false;   
  10.        
  11.     private static Object sLock = new Object();   
  12.        
  13.   
  14.        
  15.     @Override  
  16.     public IBinder onBind(Intent intent) {   
  17.         return null;   
  18.     }   
  19.        
  20.     public static void updateAppWidgetIds(int[] appWidgetIds){   
  21.         synchronized (sLock) {   
  22.             for (int appWidgetId : appWidgetIds) {   
  23.                 sAppWidgetIds.add(appWidgetId);   
  24.             }   
  25.         }   
  26.     }   
  27.        
  28.     public static int getNextWidgetId(){   
  29.         synchronized (sLock) {   
  30.             if (sAppWidgetIds.peek() == null) {   
  31.                 return AppWidgetManager.INVALID_APPWIDGET_ID;   
  32.             } else {   
  33.                 return sAppWidgetIds.poll();   
  34.                    
  35.             }   
  36.         }   
  37.     }   
  38.        
  39.     private static boolean hasMoreUpdates() {   
  40.         synchronized (sLock) {   
  41.             boolean hasMore = !sAppWidgetIds.isEmpty();   
  42.             if (!hasMore) {   
  43.                 sThreadRunning = false;   
  44.             }   
  45.             return hasMore;   
  46.         }   
  47.     }   
  48.   
  49.     @Override  
  50.     public void onCreate() {   
  51.         super.onCreate();   
  52.     }   
  53.   
  54.     @Override  
  55.     public void onStart(Intent intent, int startId) {   
  56.         super.onStart(intent, startId);   
  57.         if (null != intent) {   
  58.             if (ACTION_UPDATE_ALL.equals(intent.getAction())) {   
  59.                 AppWidgetManager widget = AppWidgetManager.getInstance(this);   
  60.                 updateAppWidgetIds(widget.getAppWidgetIds(new ComponentName(this, NewsWidgetProvider.class)));   
  61.             }   
  62.         }   
  63.         synchronized (sLock) {   
  64.             if (!sThreadRunning) {   
  65.                 sThreadRunning=true;   
  66.                 new Thread(this).start();   
  67.             }   
  68.         }   
  69.     }   
  70.   
  71.     @Override  
  72.     public void run() {   
  73.         SharedPreferences setting=getSharedPreferences("com.xxxx.news_preferences"0);   
  74.         String updateTime=setting.getString("list_time""1800000");   
  75.         String updateUrl=setting.getString("list_site""xxxxxxxxx");   
  76.            
  77.            
  78.         AppWidgetManager appWidgetManager=AppWidgetManager.getInstance(this);   
  79.         RemoteViews updateViews=null;   
  80.            
  81.         while (hasMoreUpdates()) {   
  82.             int appWidgetId=getNextWidgetId();   
  83.             List<RssNews> listNews = NewsContenttList.getNewsList(updateUrl);   
  84.             if (listNews != null) {   
  85.                 updateViews = NewsWidgetProvider.updateAppWidget(this, listNews);   
  86.             }   
  87.             if (updateViews != null) {   
  88.                 appWidgetManager.updateAppWidget(appWidgetId, updateViews);   
  89.             }   
  90.         }   
  91.            
  92.         Intent updateIntent=new Intent(ACTION_UPDATE_ALL);   
  93.         updateIntent.setClass(this, NewsService.class);   
  94.         PendingIntent pending=PendingIntent.getService(this0, updateIntent, 0);   
  95.            
  96.         Time time = new Time();   
  97.         long nowMillis = System.currentTimeMillis();   
  98.         time.set(nowMillis+Long.parseLong(updateTime));   
  99.         long updateTimes = time.toMillis(true);   
  100.         Log.d(TAG, "request next update at "+updateTimes);   
  101.            
  102.         AlarmManager alarm=(AlarmManager)getSystemService(Context.ALARM_SERVICE);   
  103.         alarm.set(AlarmManager.RTC_WAKEUP, updateTimes, pending);   
  104.         stopSelf();   
  105.     }   
  106.   
  107. }  
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();
	

	
	@Override
	public 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;
		}
	}

	@Override
	public void onCreate() {
		super.onCreate();
	}

	@Override
	public 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();
			}
		}
	}

	@Override
	public 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();
	}

}

这个只是我的情况,如果大家有不一样的情况,稍微修改即可。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值