2016-12-31 6 views
0

Я хочу запустить таймер в течение 24 часов, когда переключатель включен, через 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 и установите будильник. Таким образом, даже если ваш сервис будет убит, он будет перезапущен системой, когда таймер закончится.

В-третьих, есть ли у вас статическая ссылка на объект вида в этом коде? Я даже не могу подсчитать количество способов, которые являются плохими идеями. НИЧЕГО не за пределами жизненного цикла Activity должно касаться представления.

+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 –

Смежные вопросы