1
我想寫一個時鐘小部件,顯示紀元的時間,我需要它來更新每一秒。目前我使用的是採用了處理程序服務這樣做:
public class EpochService extends Service {
private static final String TAG = "EpochService";
// the time
private static long mTime;
// ui components
private static RemoteViews mViews;
private static ComponentName mComponent;
private static AppWidgetManager mManager;
// handler
private static Handler mHandler = new Handler();
@Override
public void onStart(Intent intent, int id){
Log.i(TAG, "start");
// register the receiver
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
registerReceiver(mIntentReceiver, filter);
// set up ui
mViews = new RemoteViews(this.getPackageName(), R.layout.main);
mManager = AppWidgetManager.getInstance(this);
mComponent = new ComponentName(this, Clock.class);
// start
mHandler.removeCallbacks(mEpochTimerTask);
mHandler.postDelayed(mEpochTimerTask, 1000);
}
@Override
public void onDestroy(){
// unregister receiver to prevent memory leak
mHandler.removeCallbacks(mEpochTimerTask);
unregisterReceiver(mIntentReceiver);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
/**
* The broadcast receiver - handles screen off events to stop drawing
*/
private static BroadcastReceiver mIntentReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
Log.i(TAG, "stop drawing");
mHandler.removeCallbacks(mEpochTimerTask);
}
else {
Log.i(TAG, "start drawing");
mHandler.removeCallbacks(mEpochTimerTask);
mHandler.postDelayed(mEpochTimerTask, 1000);
}
}
};
/**
* Run the Epoch Timer
*/
private static Runnable mEpochTimerTask = new Runnable(){
@Override
public void run() {
Log.i(TAG, "run");
mTime = System.currentTimeMillis()/1000;
mViews.setTextViewText(R.id.time, Long.toString(mTime));
mManager.updateAppWidget(mComponent, mViews);
mHandler.postAtTime(mEpochTimerTask, SystemClock.uptimeMillis() + 1000);
}
};
}
我遇到的問題是,隨着時間的推移,我的主屏幕似乎得到明顯laggy。我對Android相當陌生,所以我不確定我所做的是正確的方法,還是有更好的方法來實現這一點(也許使用AsyncTask?)。有沒有辦法頻繁更新小部件而不會受到UI滯後的影響?如果我需要發佈更多代碼,請告訴我。我的小部件只是啓動和停止這項服務,而我的appwidget-provder有android:updatePeriodMillis =「0」。
在此先感謝您的幫助。
你是說在沒有編寫新的主屏幕的情況下沒有辦法用秒針寫一個時鐘部件?這看起來不正確。 – Jon 2010-05-24 23:52:56
「你是說在沒有編寫新的主屏幕的情況下沒有辦法用秒針寫一個時鐘部件?」正確。應用小部件系統不是爲快速變化的數據而設計的,每秒一次的數據絕對符合「快速變化」的要求。 – CommonsWare 2010-05-25 00:09:45
@CommonsWare所以,如果開發人員想要開發一個小時,分鐘,秒圖像設計的小部件,該怎麼辦。第二它需要每秒更改圖像,因此,如何實現這一點。你能爲此提供任何解決方案嗎? – 2012-09-19 11:34:10