<script type="text/javascript"></script> 在开发Android的widget时,第一个需要解决的问题就是怎么实现让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 {
@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:
- 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();
@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();
}
}
这个只是我的情况,如果大家有不一样的情况,稍微修改即可。