Java 使用Android在后台运行多个倒计时和多个秒表
我是Android和Java新手,我一直在尝试解决计时器的问题。请帮助 我有一个应用程序,用户可以创建多个倒计时和多个秒表。 下面给出了倒计时计时器的示例代码。(秒表也使用处理程序以类似的方式实现)。我希望计时器和秒表即使在用户离开应用程序时也能在后台运行。当用户再次返回应用程序时,应该显示计时器的当前状态,而不是显示初始状态。 问题是,当我离开应用程序时,计时器和秒表正在运行,但当用户返回应用程序时,结果不会发布到UI中。创建一个新实例,并再次显示00:00:00的新计时器,而旧计时器在后台继续运行,无法停止。在下面的代码中,我还有一个侦听器,它将结果发布到其回调中的UI中。此接口在我的活动中实现。那么,有谁能为这个问题提出一个解决方案吗Java 使用Android在后台运行多个倒计时和多个秒表,java,android,timer,Java,Android,Timer,我是Android和Java新手,我一直在尝试解决计时器的问题。请帮助 我有一个应用程序,用户可以创建多个倒计时和多个秒表。 下面给出了倒计时计时器的示例代码。(秒表也使用处理程序以类似的方式实现)。我希望计时器和秒表即使在用户离开应用程序时也能在后台运行。当用户再次返回应用程序时,应该显示计时器的当前状态,而不是显示初始状态。 问题是,当我离开应用程序时,计时器和秒表正在运行,但当用户返回应用程序时,结果不会发布到UI中。创建一个新实例,并再次显示00:00:00的新计时器,而旧计时器在后台继
public class CountDownTimerService {
public interface CounterTimeChangeListener {
public void onCounterTimeChange(String time,Boolean counterFinished);
}
CounterTimeChangeListener listener;
MyCountDownTimer myCountDownTimer;
String output;
int length;
long startTime = 0;
long currentTime = 0;
long timeElapsed = 0;
long timeRemaining = 0;
long prevTimeRemaining = 0;
public CountDownTimerService(int countDownFutureTime)
{
myCountDownTimer= new MyCountDownTimer(countDownFutureTime,1000);
length=countDownFutureTime;
}
// code for countdown timer
// this function format the time to hours seconds and minutes format
public String formatTime(long mills)
{
output = "";
long seconds = mills / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
seconds = seconds % 60;
minutes = minutes % 60;
hours = hours % 60;
String secondsD = String.valueOf(seconds);
String minutesD = String.valueOf(minutes);
String hoursD = String.valueOf(hours);
if (seconds < 10)
secondsD = "0" + seconds;
if (minutes < 10)
minutesD = "0" + minutes;
if (hours < 10)
hoursD = "0" + hours;
output = hoursD +":" +minutesD +":"+ secondsD;
return output;
}
// this function is called on start button click
public void CountDownControl(int state) {
if(state==0)
{
startTime = System.currentTimeMillis();
myCountDownTimer.start();
}
else if(state==1)
{
// when the pause is clicked
myCountDownTimer.cancel();
currentTime = System.currentTimeMillis();
timeElapsed = currentTime - startTime;
if (prevTimeRemaining == 0)
timeRemaining = length - timeElapsed;
else
timeRemaining = prevTimeRemaining - timeElapsed;
prevTimeRemaining = timeRemaining;
myCountDownTimer= new MyCountDownTimer(timeRemaining,1000);
if (listener!=null) {
listener.onCounterTimeChange(formatTime(timeRemaining), false);
}
}
}
// this function is called on reset button click
public void resetInitial()
{
prevTimeRemaining = 0;
myCountDownTimer.cancel();
if (listener!=null) {
listener.onCounterTimeChange(formatTime(length),false);
}
myCountDownTimer= new MyCountDownTimer(length,1000);
}
public class MyCountDownTimer extends CountDownTimer {
public MyCountDownTimer(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
public void onTick (long millisUntilFinished) {
// calls the fragment's callback function passing the time value
Log.e("in counter","1");
if (listener!=null) {
Log.e("in counter","2");
listener.onCounterTimeChange(formatTime(millisUntilFinished), false);
}
}
public void onFinish() {
/*
* write code for an alarm when timer times out
*
* */
prevTimeRemaining = 0;
if (listener!=null) {
listener.onCounterTimeChange(formatTime(length),true);
}
myCountDownTimer= new MyCountDownTimer(length,1000);
}
}
public void setCounterTimeChangeListener(CounterTimeChangeListener listener) {
this.listener = listener;
}
}
公共类倒计时服务{
公共接口计数器TimeChangeListener{
公用void onCounterTimechanage(字符串时间,布尔反修饰);
}
计数器时间变化监听器;
MyCountDownTimer MyCountDownTimer;
字符串输出;
整数长度;
长起始时间=0;
长电流时间=0;
长时间运行=0;
长时间剩余=0;
长时间剩余=0;
公共CountDownTimerService(int countDownFutureTime)
{
myCountDownTimer=新的myCountDownTimer(countDownFutureTime,1000);
长度=未来时间倒计时;
}
//倒数计时器代码
//此函数将时间格式化为小时、秒和分钟格式
公共字符串格式化时间(长时间)
{
输出=”;
长秒=mills/1000;
长分钟=秒/60;
长时间=分钟/60;
秒=秒%60;
分钟=分钟%60;
小时数=小时数%60;
String secondsD=String.valueOf(秒);
String minutesD=String.valueOf(分钟);
String hoursD=String.valueOf(小时);
如果(秒<10)
secondsD=“0”+秒;
如果(分钟<10)
分钟数d=“0”+分钟;
如果(小时<10)
hoursD=“0”+小时;
输出=小时数+“:”+分钟数+“:”+秒数;
返回输出;
}
//单击“开始”按钮时调用此函数
公共无效倒计时控制(int状态){
如果(状态==0)
{
startTime=System.currentTimeMillis();
myCountDownTimer.start();
}
else if(state==1)
{
//单击暂停时
myCountDownTimer.cancel();
currentTime=System.currentTimeMillis();
时间经过=当前时间-开始时间;
如果(prevTimeRemaining==0)
剩余时间=长度-经过的时间;
其他的
timeRemaining=prevTimeRemaining-时间流逝;
PrevTime剩余=剩余时间;
myCountDownTimer=新的myCountDownTimer(剩余时间,1000);
if(侦听器!=null){
onCounterTimeChange(formatTime(剩余时间),false);
}
}
}
//单击“重置”按钮时调用此函数
公共无效重置初始值()
{
prevTimeRemaining=0;
myCountDownTimer.cancel();
if(侦听器!=null){
onCounterTimeChange(formatTime(长度),false);
}
myCountDownTimer=新的myCountDownTimer(长度,1000);
}
公共类MyCountDownTimer扩展了CountDownTimer{
公共MyCountDownTimer(长毫秒未来,长倒计时间隔){
超级(毫秒未来,倒计时间隔);
}
公共void onTick(长毫秒未完成){
//调用片段的回调函数,传递时间值
Log.e(“柜台内”、“1”);
if(侦听器!=null){
Log.e(“柜台内”、“2”);
onCounterTimeChange(formatTime(millisUntilFinished),false);
}
}
公共无效onFinish(){
/*
*当计时器超时时,编写报警代码
*
* */
prevTimeRemaining=0;
if(侦听器!=null){
onCounterTimeChange(formatTime(length),true);
}
myCountDownTimer=新的myCountDownTimer(长度,1000);
}
}
public void setCounterTimeChangeListener(CounterTimeChangeListener侦听器){
this.listener=listener;
}
}
您看过Android服务吗