2016-12-30 3 views
1

Я пишу приложение для тренировки и пытаюсь реализовать таймер отдыха в действии Train. CountDownTimer, расположенный в пределах Train и вызывается, когда пользователь нажимает кнопку запуска.Обновление TextView с таймером onTick после ухода и возврата к активности

public CountDownTimer createTimer(long timerDuration) { 

    Log.d("new timer duration:", "value: " + timerDuration); 
    return new CountDownTimer(timerDuration, 1000) { 

     @Override 
     public void onTick(long millisUntilFinished) { 
      int progress = (int) (millisUntilFinished/1000); 
      secondsLeftOnTimer = progress; // update variable for rest of app to access 

      // Update the output text 
      breakTimerOutput.setText(secondsToString(progress)); 
     } 

     @Override 
     public void onFinish() { // Play a beep on timer finish 
      breakTimerOutput.setText(secondsToString(timerDurationSeconds)); 
      playAlertSound(); // TODO: Fix the delay before playing beep. 
     } 
    }.start(); 
} 

Таймер работает, до тех пор, пока пользователь остается в Train деятельности. Если вы переключитесь на другое действие, таймер продолжает работать в фоновом режиме (звуковой сигнал все еще происходит), и это то, что я хочу. Однако, если вы вернетесь к работе в поезде, то breakTimerOutput TextView больше не обновляется onTick.

Как я могу «повторно подключить» breakTimerOutput к onTick, когда пользователь снова входит в действие Train?

Here is the full code for the activity, just in case.

+0

Считаете ли вы onPause и onResume вашей деятельности поезда? –

+0

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

ответ

1

Я хотел бы предложить, чтобы сохранить таймер внутри Service и использовать BroadcastReceiver получить галочку, чтобы обновить TextView в вашем TrainActivity.

Вам необходимо ввести CountDownTimer из Service. Поэтому в методе onCreate вашего Service вам необходимо инициализировать LocalBroadcastManager.

broadcastManager = LocalBroadcastManager.getInstance(this); 

Так что на каждом тике на свой таймер (т.е. onTick метод), вы могли бы рассмотреть вызов функции, как это.

static final public String UPDATE_TIME = "UPDATE_TIME"; 
static final public String UPDATED_TIME = "UPDATED_TIME"; 

public void updateTextView(String time) { 
    Intent intent = new Intent(UPDATE_TIME); 
    if(time != null) 
     intent.putExtra(UPDATED_TIME, time); 
    broadcastManager.sendBroadcast(intent); 
} 

Теперь в вашем TrainActivity создать BroadcastReceiver.

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    super.setContentView(R.layout.copa); 
    receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String time = intent.getStringExtra(YourService.UPDATED_TIME); 
      // Update your TextView here. 
     } 
    }; 
} 

И кроме того, вы должны зарегистрироваться и разрегистрировать BroadcastReceiver.

@Override 
protected void onStart() { 
    super.onStart(); 
    LocalBroadcastManager.getInstance(this).registerReceiver((receiver), 
     new IntentFilter(YourService.UPDATE_TIME) 
    ); 
} 

@Override 
protected void onStop() { 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver); 
    super.onStop(); 
} 
+0

Спасибо! Это выглядит хорошо. Я сделаю это. Правильно ли я полагаю, что код в вашей последней строфе входит в «Train»? –

+0

Да, 'Receiver' и' onStart' и 'onStop' принадлежат' TrainActivity'. –

+0

Спасибо! Наконец, я должен определить «приемник» как «приемник BroadcastReceiver», правильно? Это приводит к возникновению проблемы с вашим последним битом кода: «LocalBroadcastManager.getInstance (this) .registerReceiver (приемник), новый IntentFilter (BreakTimer.UPDATE_TIME);' –