我正在编写一个锻炼应用程序,并试图在 Train
Activity 中实现一个休息计时器。 CountDownTimer
位于 Train
中,当用户按下开始按钮时调用。
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
Activity 中,计时器就会工作。如果您切换到另一个 Activity ,计时器将继续在后台运行(仍会发出蜂鸣声),这正是我想要的。但是,如果您返回到 Train Activity ,breakTimerOutput
TextView 将不再由 onTick
更新。
当用户重新进入 Train
Activity 时,如何将 breakTimerOutput
“重新连接”到 onTick
?
最佳答案
我想建议将计时器保留在 Service
中,并使用 BroadcastReceiver
接收更新 TextView
中的滴答声 火车 Activity
。
您需要从 Service
启动 CountDownTimer
。因此,在 Service
的 onCreate
方法中,您需要初始化一个 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();
}
关于java - 离开和返回 Activity 后使用计时器 onTick 更新 TextView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41397778/