Android实现widget定时更新
来源:互联网 发布:单片机仿真器 编辑:程序博客网 时间:2024/05/17 05:03
在开发Android的widget时,第一个需要解决的问题就是怎么实现让widget定时更新,在查阅比较多的资料后,一般情况用Service在后台更新,废话不多说,贴代码如下:
Widget:
Service:
这个只是我的情况,如果大家有不一样的情况,稍微修改即可。
Widget:
- 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);
- }
- }
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();
- @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();
- }
- }
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();}}
这个只是我的情况,如果大家有不一样的情况,稍微修改即可。
- Android实现widget定时更新
- Android实现widget定时更新
- Android widget定时更新及事件处理
- android AppWidget的使用以及利用TimerTask实现widget的定时更新
- android AppWidget的使用以及利用Service TimerTask实现widget的定时更新
- Android widget更新 监听
- android widget不更新
- 开启一个服务定时更新widget组件
- 【Android】widget不能及时更新
- android service 更新widget UI
- android-widget实现跳转
- Android的widget实现
- Android的Widget的定时刷新
- Android 定时更新UI
- Android在后台线程实现 定时更新时间
- Android 开发之实时更新 App Widget
- Android 开发之实时更新 App Widget
- Android 开发之实时更新 App Widget
- 插入排序、归并排序
- 深入剖析WTL框架(四)
- AsyncTaskTest
- 深入剖析WTL框架(五)
- C#的StreamReader读文件
- Android实现widget定时更新
- 对html页面中text元素进行复制
- 深入剖析WTL框架(六)
- 数组逆序
- 硬件时钟处理过程
- 页面开发中常用的方法
- 骰子作画的算法
- VC获取当前时间
- 编程的许多方面