灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2573回复:0

Android实现widget定时更新

楼主#
更多 发布于:2012-09-06 13:45


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

Widget:

[java] 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
{
@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] 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();
                                                                                                                                                                                                                            
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();
                                                                                                                                                                                                                



喜欢0 评分0
游客

返回顶部