什么是制作一个每6-8秒更新一次内容的小部件的正确方法,Android

时间:2010-09-23 20:41:19

标签: android widget

我想要完成的最接近的例子是“Engadget”小部件。 它每5-10分钟从互联网上更新一次数据,每隔5-7秒“滚动”到故事中。 我想它设置了5到10分钟的时间间隔到widget's provider调用onUpdate而没有内置限制,就像这样......

AlarmManager alarms = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarms.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), updateRateSeconds * 1000, newPending); 

然后真正的问题..更新小部件内容而不调用onUpdate。

在这里我想象一下,小部件提供者内部存在一个计时器或一个Runnable,每当它被调用时,它就会用这样的东西重新安排自己

public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
...

    mHandler.removeCallbacks(mUpdateTimeTask);
    mHandler.postDelayed(mUpdateTimeTask, 1000);
}

private Runnable mUpdateTimeTask = new Runnable() {
           public void run() {

           final long start = mStartTime;
           long millis = SystemClock.uptimeMillis() - start;
           int seconds = (int) (millis / 1000);


           int minutes = seconds / 60;
               seconds     = seconds % 60;
...

     mHandler.postAtTime(this,start + (((minutes * 60) + seconds + 1) * 1000));
}

然后在widget提供程序里面 onDeletedonDisabled

我removeCallbacks mHandler.removeCallbacks(mUpdateTimeTask);

该计划有什么问题吗? 我是否需要提供服务以从那里更新窗口小部件并保持活动状态而不将AlarmManager设置为窗口小部件的配置? 出于某种原因,我在onUpdate上进行了双重调用,并且在删除小部件后,runnable继续运行。

2 个答案:

答案 0 :(得分:1)

看看ViewFlipper。您可以使用它为一组项目更新一次数据,然后设置它们循环的频率。

答案 1 :(得分:1)

任何连续运行的东西(I.E. mp3播放器或收音机)或需要某种形式的轮询(警报,SO显示小部件,天气错误)都应该写成服务。我知道这是旧的,但请查看这些视频以获取有关最佳实践的更多信息
http://developer.android.com/videos/index.html#v=M1ZBjlCRfz0