2016-02-14 4 views
0

Я пытаюсь найти способ запуска таймера подсчета с определенного времени (например, 01:34:22). На данный момент у меня есть кнопка, которую можно использовать для запуска таймера, но мне нужно, чтобы таймер «продолжал», когда приложение закрыто.Возобновление таймера при повторном открытии приложения

Поэтому мне нужно найти способ сохранить время начала таймера, а затем возобновить, когда приложение будет открыто, используя время начала и текущее время.

Это код для таймера:

public abstract class CountUpTimer { 
private final long interval; 
private long base; 

public CountUpTimer(long interval) { 
    this.interval = interval; 
} 

public void start() { 
    base = SystemClock.elapsedRealtime(); 
    handler.sendMessage(handler.obtainMessage(MSG)); 
} 

public void stop() { 
    handler.removeMessages(MSG); 
} 

public void reset() { 
    synchronized (this) { 
     base = SystemClock.elapsedRealtime(); 
    } 
} 

abstract public void onTick(long elapsedTime); 

private static final int MSG = 1; 

private Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     synchronized (CountUpTimer.this) { 
      long elapsedTime = SystemClock.elapsedRealtime() - base; 
      onTick(elapsedTime); 
      sendMessageDelayed(obtainMessage(MSG), interval); 
     } 
    } 
}; 

}

И это код, я использую для установки таймера:

private void setupTimer() { 
    timerTextView = (TextView) findViewById(R.id.timerTextView); 
    timer = new CountUpTimer(1) { 
     @Override 
     public void onTick(long elapsedTime) { 
      timerCount = elapsedTime; 
      String finalTimer = String.format("%02d:%02d:%02d", 
        TimeUnit.MILLISECONDS.toHours(elapsedTime), 
        TimeUnit.MILLISECONDS.toMinutes(elapsedTime), 
        TimeUnit.MILLISECONDS.toSeconds(elapsedTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(elapsedTime)) 
      ); 

      timerTextView.setText(finalTimer); 
     } 
    }; 

    timer.stop(); 
} 

Это называется, когда представление создано.

И это код, когда кнопка запуска сливают:

private void addTimerLister() { 
    startTimerButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      timer.start(); 

      DateTime startTime = DateTime.now(); 
      long startTimeMilliseconds = startTime.getMillis(); 

      SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
      SharedPreferences.Editor editor = sharedPreferences.edit(); 
      editor.putString("attractionTimerName", currentAttraction.name); 
      editor.putLong("attractionTimerStart", startTimeMilliseconds); 
      editor.putBoolean("attractionTimerRunning", true); 
      editor.commit(); 

      animateFade(); 
     } 
    }); 
} 

Как вы можете видеть, я отталкивался экономии времени начала, но мне нужен способ, чтобы возобновить таймер когда приложение будет открыто. При необходимости я могу использовать JodaTime.

У кого-нибудь есть предложения?

ответ

1

Используйте SharedPreferences, чтобы сохранить текущее время в и получить это время в onResume. Удалите сообщения обработчика в и отправьте сообщение в onResume, когда вы получили время.

Сбросить таймер в onPause и повторно инициализировать его в onResume с восстановленным временем.

timer = new CountUpTimer(retrievedTime) { 
     @Override 
     public void onTick(long elapsedTime) { 
      timerCount = elapsedTime; 
      String finalTimer = String.format("%02d:%02d:%02d", 
        TimeUnit.MILLISECONDS.toHours(elapsedTime), 
        TimeUnit.MILLISECONDS.toMinutes(elapsedTime), 
        TimeUnit.MILLISECONDS.toSeconds(elapsedTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(elapsedTime)) 
      ); 

      timerTextView.setText(finalTimer); 
     } 
    }; 

Если вы не хотите повторно инициализировать таймер снова, отправьте сообщение обработчику.

Bundle b = new Bundle(); 
    b.putLong(YourClass.COUNTER_TIME, retrievedTime); // YourClass.COUNTER_TIME is a public static string 
    Message msg = getHandler().obtainMessage(); // Write getHandler() in CountUpTimer 
    msg.setData(b); 
    mHandler.sendMessage(msg); 

, а затем получить его в handleMessage()

@Override 
    public void handleMessage(Message msg) { 
     synchronized (CountUpTimer.this) { 
      long retrievedTime = msg.getData().getLong(YourClass.COUNTER_TIME, 0) 
     } 
    } 

Если вы хотите, чтобы таймер будет работать даже после того, как приложение будет закрыто или система убивает приложение, используйте услугу.

+0

Да, это то, что я собираюсь сделать. Я не уверен, как возобновить таймер. – user3746428

+0

Я подсчитываю, а не вниз. Может ли CountDownTimer использоваться для подсчета? – user3746428

+0

Извините, я спешил, поэтому предположил, что вы используете таймер обратного отсчета. – Piyush

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