我搜索过Google,SO和Android开发者,但我需要一些进一步的决策帮助。这已经在离散的主题中进行了讨论,但我想对洞察力/设计决策提供一些帮助。
我想要完成的是一种计时器,在45分钟之后发出警报,然后发出警报,比如15分钟之后。当最后一个警报触发时,循环无限期地重新启动。这将依次看起来像开始 - > 45分钟倒计时 - >警报 - > 15分钟倒计时 - >警报 - >回到45分钟倒计时重复循环。
这是构建工作/休息周期应用程序的尝试,但我遇到了两个具体问题以及可能的设计缺陷。
我的目标,简而言之:
目前我(通常,有一些细节不同)使用实现Runnable的服务,其延迟与不同计时器的持续时间相匹配。当第一个延迟结束时(45分钟后),另一个Runnable被初始化并运行(设置为15分钟)。 这非常有效。我为服务使用了部分唤醒锁,大多数时候让它运行大约一个周期,但是事情似乎停止了。如果我关闭应用程序并再次启动它,则循环重新开始。
现在,除此之外,我想用每个计时器剩余的分钟数更新UI,这意味着我必须以某种方式定期向UI发布“帖子”以便看到视觉进度。
我是以正确的方式来做这件事的吗?我应该采用另一种方法吗?哪种方法合适?
答案 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);
}
};
}