Java 使用Android在后台运行多个倒计时和多个秒表

Java 使用Android在后台运行多个倒计时和多个秒表,java,android,timer,Java,Android,Timer,我是Android和Java新手,我一直在尝试解决计时器的问题。请帮助 我有一个应用程序,用户可以创建多个倒计时和多个秒表。 下面给出了倒计时计时器的示例代码。(秒表也使用处理程序以类似的方式实现)。我希望计时器和秒表即使在用户离开应用程序时也能在后台运行。当用户再次返回应用程序时,应该显示计时器的当前状态,而不是显示初始状态。 问题是,当我离开应用程序时,计时器和秒表正在运行,但当用户返回应用程序时,结果不会发布到UI中。创建一个新实例,并再次显示00:00:00的新计时器,而旧计时器在后台继

我是Android和Java新手,我一直在尝试解决计时器的问题。请帮助 我有一个应用程序,用户可以创建多个倒计时和多个秒表。 下面给出了倒计时计时器的示例代码。(秒表也使用处理程序以类似的方式实现)。我希望计时器和秒表即使在用户离开应用程序时也能在后台运行。当用户再次返回应用程序时,应该显示计时器的当前状态,而不是显示初始状态。 问题是,当我离开应用程序时,计时器和秒表正在运行,但当用户返回应用程序时,结果不会发布到UI中。创建一个新实例,并再次显示00:00:00的新计时器,而旧计时器在后台继续运行,无法停止。在下面的代码中,我还有一个侦听器,它将结果发布到其回调中的UI中。此接口在我的活动中实现。那么,有谁能为这个问题提出一个解决方案吗

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服务吗