2016-12-31 31 views
0

我想运行24小时的计时器时,开关切换到ON,24小时开关将被关闭后..如何运行定时器作为服务?

但问题,如果活动被关闭或后退按钮按下计时器将杀!

经过一番研究,我认为我需要运行计时器作为服务,也许?我该怎么做??

感谢每一个。

这里是我的计时器:

CountDownTimer timert = new CountDownTimer(86400000,1000) { 
 

 
     public void onTick(long millisUntilFinished) { 
 

 
      String TL =String.format(Locale.US ,"%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millisUntilFinished), 
 
        TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % TimeUnit.HOURS.toMinutes(1), 
 
        TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) % TimeUnit.MINUTES.toSeconds(1)); 
 

 
      TimeLeft.setText(TL); 
 

 
     } 
 

 
     public void onFinish() { 
 
      MainActivity.aSwitch.setChecked(false); 
 
      creditText.setText("Toggle On To Start"); 
 
     } 
 
    };

回答

2

首先,后退按钮或关闭活动不会杀死服务(除非该服务被捆绑,但没有启动)。但是它会增加它因资源而死亡的可能性。

其次,服务不是做长期定时器的正确方法。使用AlarmManager并设置警报。这样即使你的服务被终止了,当定时器结束时它也会被系统重新启动。

第三 - 你有代码中的视图对象的静态引用?我甚至无法计算出这是一个坏主意的方式的数量。没有任何活动的生命周期应该触及一个视图。

+0

但是我想显示倒计数?如果我使用AlarmManager,我不能显示一个24小时的柜台? –

0

您也可以处理程序为这个one..hope它的工作原理

public void countDownStart() { 
    handler = new Handler(); 
    runnable = new Runnable(){ 
     @Override 
     public void run(){ 
      handler.postDelayed(this,1000); 
      try { 
       FestCountdownTimer timer = new FestCountdownTimer(00, 00, 9, 3, 01, 2017); 
       new CountDownTimer(timer.getIntervalMillis(), 1000) { 
        @Override 
        public void onTick(long millisUntilFinished){ 
         int days = (int) ((millisUntilFinished/1000)/86400); 
         int hours = (int) (((millisUntilFinished/1000) 
           - (days * 86400))/3600); 
         int minutes = (int) (((millisUntilFinished/1000) 
           - (days * 86400) - (hours * 3600))/60); 
         int seconds = (int) ((millisUntilFinished/1000) % 60); 
         String countdown = String.format("%02dd %02dh %02dm %02ds", days, 
           hours, minutes, seconds); 
         txtTimerDay.setText("" + String.format("%02d", days)); 
         txtTimerHour.setText("" + String.format("%02d", hours)); 
         txtTimerMinute.setText("" 
           + String.format("%02d", minutes)); 
         txtTimerSecond.setText("" 
           + String.format("%02d", seconds)); 
        } 
        @Override 
        public void onFinish() { 
         textViewGone(); 
       MainActivity.aSwitch.setChecked(false); 
     creditText.setText("Toggle On To Start"); 
        } 
       }.start(); 
      } catch (Exception e) { 
       e.printStackTrace();    } 
     } 
    }; 
    handler.postDelayed(runnable, 1 * 1000); 



} 

记住你9 is Hours,3 is date,1 is Febraury Month ..Month从0th Index

FestCoutdownTimer类开始

public class FestCountdownTimer { 
    private long intervalMillis; 
    public FestCountdownTimer(int second, int minute, int hour, int monthDay, int month, int year) { 
     Time futureTime = new Time(); 
     // Set date to future time 
     futureTime.set(second, minute, hour, monthDay, month, year); 
     futureTime.normalize(true); 
     long futureMillis = futureTime.toMillis(true); 
     Time timeNow = new Time(); 
     // Set date to current time 
     timeNow.setToNow(); 
     timeNow.normalize(true); 
     long nowMillis = timeNow.toMillis(true); 
     // Subtract current milliseconds time from future milliseconds time to retrieve interval 
     intervalMillis = futureMillis - nowMillis; 
    } 
    public long getIntervalMillis() { 
     return intervalMillis; 
    } 
} 

希望它可以帮助你。

+0

非常感谢您的惊人答案,但我如何随时取消它? –

+0

你需要使用finish()方法。如果我的回答满足请upvote –