如何在Android中制作重复的多个间隔计时器?

时间:2012-01-26 14:15:02

标签: android

我搜索过Google,SO和Android开发者,但我需要一些进一步的决策帮助。这已经在离散的主题中进行了讨论,但我想对洞察力/设计决策提供一些帮助。

我想要完成的是一种计时器,在45分钟之后发出警报,然后发出警报,比如15分钟之后。当最后一个警报触发时,循环无限期地重新启动。这将依次看起来像开始 - > 45分钟倒计时 - >警报 - > 15分钟倒计时 - >警报 - >回到45分钟倒计时重复循环。

这是构建工作/休息周期应用程序的尝试,但我遇到了两个具体问题以及可能的设计缺陷。

我的目标,简而言之:

  • 创建以特定间隔触发警报的工作/中断周期
  • 让它在电话睡眠中生存(不必强迫屏幕打开)
  • 更新用户界面以获取每个间隔/计时器的进度反馈

目前我(通常,有一些细节不同)使用实现Runnable的服务,其延迟与不同计时器的持续时间相匹配。当第一个延迟结束时(45分钟后),另一个Runnable被初始化并运行(设置为15分钟)。 这非常有效。我为服务使用了部分唤醒锁,大多数时候让它运行大约一个周期,但是事情似乎停止了。如果我关闭应用程序并再次启动它,则循环重新开始。

现在,除此之外,我想用每个计时器剩余的分钟数更新UI,这意味着我必须以某种方式定期向UI发布“帖子”以便看到视觉进度。

我是以正确的方式来做这件事的吗?我应该采用另一种方法吗?哪种方法合适?

1 个答案:

答案 0 :(得分:4)

使用AlarmManager来安排闹钟,并在您安排闹钟时传入您想要发生的任何Intent。当45分钟警报响起时,安排另一个警报,当该警报响起时,安排另一个45分钟警报,依此类推。 的修改

要每分钟更新一次用户界面,以告知在您的活动中还剩下多少时间:

public class MyActivity extends Activity {
int minutes = 45;
TextView tv;
public void onCreate(Bundle state) {
super.onCreate(state);
//set the content, grab your textview, etc...boilerplate
    Handler handler = new Handler();
    //schedule alarm here and post runnable as soon as scheduled
    handler.post(r)
}

    //somewhere else in your Class
     Runnable r = new Runnable() {
            @Override
            public void run() {
            if(!minutes == 0)
               tv.setText(minutes--);
               handler.postDelayed(this, 60000); //run the runnable in a minute again 
            else 
               handler.removeCallbacks(this);
            }
        };
}