java - 离开和返回 Activity 后使用计时器 onTick 更新 TextView

标签 java android android-activity countdowntimer

我正在编写一个锻炼应用程序,并试图在 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

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

最佳答案

我想建议将计时器保留在 Service 中,并使用 BroadcastReceiver 接收更新 TextView 中的滴答声 火车 Activity

您需要从 Service 启动 CountDownTimer。因此,在 ServiceonCreate 方法中,您需要初始化一个 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/

相关文章:

java - 为什么我不能通过 "for"循环保存 EnumMap 条目,即使我使用 "final"?最佳解决方法?

android - 在android中以圆形路径移动图像

java - Libgdx 坐标系原点(0,0),不在屏幕左下角

java - 在 ImageView 中布局边距推送图像

java - 创建时突出显示 ListView 的第一项

android - 撰写中的文本字段 : Double Tap to select text is not working

安卓 WebView : Uncaught Error: INDEX_SIZE_ERR

Android Activity 命名

Android 4.4.2 - java.lang.RuntimeException : Performing stop of activity that is not resumed

java - Java中如何实现多线程