package com.ch_linghu.fanfoudroid.service; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.List; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.Service; import android.appwidget.AppWidgetManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.database.Cursor; import android.os.Handler; import android.os.IBinder; import android.util.Log; import android.widget.RemoteViews; import com.ch_linghu.fanfoudroid.FanfouWidget; import com.ch_linghu.fanfoudroid.FanfouWidgetSmall; import com.ch_linghu.fanfoudroid.R; import com.ch_linghu.fanfoudroid.AppParam; import com.ch_linghu.fanfoudroid.app.Preferences; import com.ch_linghu.fanfoudroid.data.Tweet; import com.ch_linghu.fanfoudroid.db.StatusTable; import com.ch_linghu.fanfoudroid.db.TwitterDatabase; public class WidgetService extends Service { protected static final String TAG = "WidgetService"; private int position = 0; private List<Tweet> tweets; private TwitterDatabase getDb() { return AppParam.mDb; } public String getUserId() { return AppParam.getMyselfId(false); } private void fetchMessages() { if (tweets == null) { tweets = new ArrayList<Tweet>(); } else { tweets.clear(); } Cursor cursor = getDb().fetchAllTweets(getUserId(), StatusTable.TYPE_HOME); if (cursor != null) { if (cursor.moveToFirst()) { do { Tweet tweet = StatusTable.parseCursor(cursor); tweets.add(tweet); } while (cursor.moveToNext()); } } } public RemoteViews buildUpdate(Context context) { RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.widget_initial_layout); updateViews .setTextViewText(R.id.status_text, tweets.get(position).text); // updateViews.setOnClickPendingIntent(viewId, pendingIntent) position++; return updateViews; } private Handler handler = new Handler(); private Runnable mTask = new Runnable() { @Override public void run() { Log.d(TAG, "tweets size=" + tweets.size() + " position=" + position); if (position >= tweets.size()) { position = 0; } ComponentName fanfouWidget = new ComponentName(WidgetService.this, FanfouWidget.class); AppWidgetManager manager = AppWidgetManager .getInstance(getBaseContext()); manager.updateAppWidget(fanfouWidget, buildUpdate(WidgetService.this)); handler.postDelayed(mTask, 10000); ComponentName fanfouWidgetSmall = new ComponentName( WidgetService.this, FanfouWidgetSmall.class); AppWidgetManager manager2 = AppWidgetManager .getInstance(getBaseContext()); manager2.updateAppWidget(fanfouWidgetSmall, buildUpdate(WidgetService.this)); handler.postDelayed(mTask, 10000); } }; public static void schedule(Context context) { SharedPreferences preferences = AppParam.mPref; if (!preferences.getBoolean(Preferences.CHECK_UPDATES_KEY, false)) { Log.d(TAG, "Check update preference is false."); return; } String intervalPref = preferences .getString( Preferences.CHECK_UPDATE_INTERVAL_KEY, context.getString(R.string.pref_check_updates_interval_default)); int interval = Integer.parseInt(intervalPref); Intent intent = new Intent(context, WidgetService.class); PendingIntent pending = PendingIntent.getService(context, 0, intent, 0); Calendar c = new GregorianCalendar(); c.add(Calendar.MINUTE, interval); DateFormat df = new SimpleDateFormat("h:mm a"); Log.d(TAG, "Scheduling alarm at " + df.format(c.getTime())); AlarmManager alarm = (AlarmManager) context .getSystemService(Context.ALARM_SERVICE); alarm.cancel(pending); alarm.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pending); } /** * @see android.app.Service#onBind(Intent) */ @Override public IBinder onBind(Intent intent) { // TODO Put your code here return null; } /** * @see android.app.Service#onCreate() */ @Override public void onCreate() { Log.d(TAG, "WidgetService onCreate"); schedule(WidgetService.this); } /** * @see android.app.Service#onStart(Intent,int) */ @Override public void onStart(Intent intent, int startId) { Log.d(TAG, "WidgetService onStart"); fetchMessages(); handler.removeCallbacks(mTask); handler.postDelayed(mTask, 10000); } @Override public void onDestroy() { Log.d(TAG, "WidgetService Stop "); handler.removeCallbacks(mTask);// 当服务结束时,删除线程 super.onDestroy(); } }