onPause / onResume活动问题

时间:2010-03-14 04:08:09

标签: android timer

我正在使用一个小型测试应用程序,它有一个计时器,可以将文本视图更新为从100到0的倒计时。这样可以正常工作,但现在我试图暂停应用程序,如果用户按下后面的按钮电话,然后重新打开他们重新打开应用程序时停止的计时器。这是我正在使用的代码:

@Override
public void onPause()
{
    if(this._timer_time_remaining > 0) {
        this.timer.cancel();
    }
    super.onPause();
    Log.v("Pausing", String.format("Pausing with %d", this._timer_time_remaining));
}

@Override
public void onResume()
{
    Log.v("Resuming", String.format("Resuming with %d", this._timer_time_remaining));

    if(this._timer_time_remaining > 0) {
        start_timer(this._timer_time_remaining);
    }
    super.onResume();
}

start_timer()方法创建一个CountDownTimer,它更新onTick方法中的textview并更新this._timer_time_remaining int变量。

CountDownTimer和_timer_time_remaining都在类级别声明,如下所示:

private CountDownTimer timer;
private int _timer_time_remaining;

在Log.v()打印中,我看到_timer_time_remaining变量在调用onPause时存储了正确的秒数,但是在onResume启动时它被设置回0。为什么变量会被重置?我认为应用程序将继续在后台运行相同的值。我错过了什么吗?这都是在扩展Activity的类中声明的。

提前致谢!

注意:已编辑以清理代码复制

5 个答案:

答案 0 :(得分:16)

如果您查看Activity lifecycle的图表,您会发现在调用onPause后,您无法保证您的活动。 Android甚至可以在不调用onDestroy的情况下杀死你。您必须使用onSaveInstanceState保存您的状态,然后使用onRestoreInstanceState恢复该状态。

This可能有用。

编辑:

生命周期涵盖不同的场景。如果您只有一个活动,则按返回相当于退出您的应用程序。如果您有活动A,它启动活动B,则为活动A调用onSaveInstanceState。当您在活动B中按回来时,它只退出并为活动A调用onRestoreInstanceState。您试图在应用程序的两个不同运行之间保存数据我需要使用某种persistent storage

答案 1 :(得分:2)

这就是我保存值的方法:(四行代码)

SharedPreferences example = getSharedPreferences("example", MODE_PRIVATE);
SharedPreferences.Editor edit = example.edit();
edit.putInt("time_remaining", (Integer)this._timer_time_remaining);
edit.commit();

在恢复时,请执行以下操作:(两行代码)

SharedPreferences example = getSharedPreferences("example", MODE_PRIVATE);
int time_remaining = example.getInt("time_remaining", 0);

我从我的一些工作代码中对此进行了调整,但实际上并没有以这种格式对其进行测试。搜索sharedPreferences的文档以了解它的工作原理。

答案 2 :(得分:1)

我不是Android上的专家,只是告诉我期望计时器如何表现

this.timer.cancel(): - 会取消计时器,但不会暂停

start_timer(this._timer_time_remaining): - 将“重新启动”计时器,而不是从最后一个位置继续。

所以你看到的是正确的。每次重新开始时间。 找出暂停计时器的api是什么(如果有的话)。

答案 3 :(得分:0)

您可以简单地将时间写入onPause中的数据库或文件,并在onResume中将其读回。

答案 4 :(得分:0)

您还可以尝试侦听按键(onKeyDown())来拦截后退按钮并将数据保存到SQLite表中。