`
danke54
  • 浏览: 21059 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

android的widget定时更新

阅读更多

<script type="text/javascript"></script> 在开发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();
	}

}


这个只是我的情况,如果大家有不一样的情况,稍微修改即可。

分享到:
评论

相关推荐

    widget定时更新

    "Widget定时更新"这个主题聚焦于如何通过Service组件来实现在后台定期更新Widget的内容,特别是更新图片,这是Android Widget功能的一个常见需求。 首先,我们来理解Widget和Service的基本概念。Widget是Android...

    android之appwidget(四)终 appwidget控件更新

    3. **Widget更新触发器**: 可以通过设置AlarmManager定时触发更新,也可以监听特定事件,如接收到新的通知或数据更改时更新Widget。 **三、源码分析** 1. **AppWidgetProvider的onReceive()方法**: 当接收到广播时...

    android 源码 android Widget开发案例 eclipse项目 直接导入

    通过这个项目,开发者不仅可以掌握基本的Widget开发技术,还能了解到如何在Android系统中与用户界面交互、如何使用BroadcastReceiver以及如何利用系统服务进行定时更新。此外,实践中遇到的问题和解决过程,也是提升...

    安卓Widget小组件相关-androidWidget小组件开发.zip

    本资料包"androidWidget小组件开发.zip"包含了一个名为"MyWidget"的示例项目,可能包含了关于如何创建和实现Android Widget小组件的代码和资源。 1. **Widget组件概述** - Android Widget是Android系统中的一个...

    android widget

    - **动态更新**:除了在安装时初始化Widget,还可以通过AlarmManager或JobScheduler定时更新Widget,或者根据需要(例如,接收到新的数据)触发更新。 - **自定义行为**:AppWidgetProvider的其他回调方法,如`...

    appwidget时间每秒刷新一次

    综上所述,创建一个每秒刷新时间的AppWidget涉及到对`AppWidgetProvider`的理解、使用`Handler`进行定时任务、布局设计以及元数据配置等多个方面。通过精心设计和实现,你可以为用户提供一个实用且实时的桌面时钟小...

    android widget源码

    1. **AppWidgetProvider**: 这是Android中Widget的核心类,它是一个BroadcastReceiver的子类,负责处理来自系统的所有Widget相关的广播事件,如添加、删除、更新等。在`AndroidManifest.xml`中,我们需要定义...

    Android应用源码之android Widget小组件开发.zip

    - 可以使用AlarmManager结合BroadcastReceiver实现定时更新,也可以利用Service在后台运行时更新。 5. **Widget的最佳实践** - 优化性能:避免在Widget更新中执行耗时操作,如网络请求。 - 用户交互:尽管Widget...

    android appwidget 经典完整代码

    3. **服务(Service)**:如果AppWidget需要后台处理或定时更新,可以使用服务来处理这些任务。例如,通过AlarmManager定期更新AppWidget的状态。 4. **Intent**:用于在AppWidget与应用的其他部分之间传递信息。 ...

    【eoeAndroid特刊】第五期 Android widget

    开发者可以通过AppWidgetManager服务请求更新Widget,或者在服务、广播接收器等其他组件中定时更新Widget。更新通常涉及到远程服务的调用,因为Widget的更新必须在主线程之外进行,以避免阻塞用户界面。 此外,为了...

    android时钟widget小部件源代码

    4. **AlarmManager**: 为了实现定时更新,开发者通常会使用AlarmManager来设置周期性的触发器,使Widget在指定的时间间隔内更新自身。 5. **权限(PERMISSIONS)**: 开发时钟Widget可能需要请求`INTERNET`权限,以便...

    android widget初涉

    - **扩展Widget的功能**:例如,增加定时更新数据的能力,或者让用户可以通过Widget直接与应用进行交互。 通过以上步骤,您可以成功地创建一个简单的Android Widget,并对其基本工作原理有了初步的理解。随着实践的...

    【eoeAndroid特刊】第四期 Android widget Ver 2.0.0

    开发者可以通过这些API轻松实现Widget的自定义行为,例如定时更新、远程视图(RemoteViews)的更新策略、以及与应用深度集成的新方法。 总之,【eoeAndroid特刊】第四期的Android Widget Ver 2.0.0更新,不仅提升了...

    android app widget小部件

    Android App Widget是Android系统提供的一种轻量级组件,允许开发者在用户的主屏幕上创建小型应用程序,通常称为小部件或快捷方式。这些小部件可以提供实时信息,如天气预报、日历事件,或者执行简单的操作,如播放...

    Android Widget示例

    - 更新Widget通常有两种方式:一是通过`AppWidgetProvider`的`onUpdate()`方法,二是设置`AlarmManager`定时触发更新。 - `onReceive()`方法是接收广播事件的主要入口,根据接收到的意图(Intent)类型执行相应...

    安卓Android源码——android Widget小组件开发.zip

    7. **Widget服务**:有时,Widget可能需要长时间运行的任务,如定时更新,此时可以使用Service来支持。 8. **AppWidgetManager**:Android系统提供的接口,用于管理所有已安装的Widget,包括添加、删除和获取Widget...

    android时钟widget例子

    布局文件可能包含一个TextView或者ImageView来显示时间,而Java代码会负责定时更新时间并将其显示在Widget上。 创建一个Android时钟Widget,我们需要遵循以下步骤: 1. **定义Widget配置文件**:在`res/xml`目录下...

    Android高级应用源码-android Widget小组件开发.zip

    - **AlarmManager和PendingIntent**:定时更新Widget通常通过AlarmManager设置定时任务,结合PendingIntent触发AppWidgetProvider的onUpdate()方法。 5. **交互功能**: - **点击事件**:可以通过在XML中设置...

    android Widget小组件开发源码.zip

    - 可以设置AlarmManager定时触发更新,或者通过PendingIntent响应用户操作来更新Widget。 8. **实例化和添加到主屏幕**: - 用户可以通过长按主屏幕,选择小部件,然后在列表中找到你的Widget来添加到主屏幕。 -...

Global site tag (gtag.js) - Google Analytics