2025-05-17

在開發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();
                                                                                                                                                                                                                 

 

摘自  心飛揚

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *