Android 暂停/恢复活动问题

Android 暂停/恢复活动问题,android,timer,Android,Timer,我有一个小的测试应用程序,我正在工作,它有一个定时器,更新一个文本视图,从100倒计时到0。这很好,但现在我尝试暂停应用程序,如果用户按下手机上的“后退”按钮,然后从重新打开应用程序时停止的位置重新启动计时器。以下是我正在使用的代码: @Override public void onPause() { if(this._timer_time_remaining > 0) { this.timer.cancel(); } super.onPause()

我有一个小的测试应用程序,我正在工作,它有一个定时器,更新一个文本视图,从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()方法创建一个倒计时,它更新onTick方法中的textview并更新this.\u timer\u time\u剩余int变量

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

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

提前谢谢


注意:编辑以清除代码复制

如果您查看图表,您将意识到在调用onPause后,您的活动没有任何保证。安卓甚至可以在不调用onDestroy的情况下终止您的活动。您必须使用保存状态并使用还原状态

可能有用

编辑:


生命周期涵盖不同的场景。如果只有一个活动,则按Back相当于退出应用程序。如果您有启动活动B的活动A,则会为活动A调用onSaveInstanceState。当您在活动B中按back键时,它将退出,并为活动A调用onRestoreInstanceState。您正试图在应用程序的两次不同运行之间保存数据,您需要为此使用某种类型的。您只需编写在onPause中超时到数据库或文件,然后在onResume中重新读取。

我不是安卓系统专家,但我只是从计时器的运行情况来判断

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

启动计时器(此。\u计时器\u剩余时间)
:-将“重新启动”计时器,而不是从最后一个位置继续

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

您还可以尝试通过按to键(onKeyDown())截取后退按钮并将数据保存到SQLite表。

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

在简历上,这样做:(两行代码)


我从我的一些工作代码中改编了它,但实际上并没有以这种精确的格式进行测试。在文档中搜索SharedReferences以了解其工作原理。

首先,感谢您的回复。我用onSaveInstanceState(Bundle savedInstancestate)方法替换了onPause方法,但是当我按下back按钮离开应用程序时,似乎没有调用该方法。我的LogCat消息没有显示,所以我认为根本没有人调用它。是否需要实现onPause和onSaveInstanceState?或者onSaveInstanceState应该处理它吗?文档对此进行了解释:“当用户从活动B导航回活动a时,调用onPause()和onStop()而不是此方法的一个示例是:不需要调用onSaveInstanceState(Bundle)因为该实例永远不会被还原,所以系统避免调用它。“按Back键不会调用onSaveInstanceState,但按Home键会调用onSaveInstanceState。感谢您的响应。我确实看到了上面提到的,但是如果按下后退按钮时没有调用onSaveInstanceState,它将不会解决我的问题,是吗?我只想在按下后退按钮时停止倒计时,然后在从主屏幕再次启动应用程序时从同一位置重新启动。我可能有误解,但这似乎无法实现。再次感谢您花了这么多时间来帮助我,我想我只是错过了一些东西。您可以在首选项中节省剩下的时间。
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);