2016-12-31 32 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 –