2012-07-18 118 views
1

我有一个更新TextView的CountDownTimer,但是当我按下后退按钮时,它停止。当我按下后退按钮时,如何保持CountDownTimer运行

CountDownTimer timer = new CountDownTimer(600000, 100) { 

    public void onTick(long millisUntilFinished) { 
     calendar.setTimeInMillis(millisUntilFinished); 

     cron.setText(sf.format(calendar.getTime())); 
    } 

    public void onFinish() { 
    } 
}; 

当我按下后退按钮并且活动被破坏时,我该如何保持它运行?

PS:我也开始GPS服务,当计时器启动时,有没有办法将CountDownTimer放入服务中?

回答

2

如果您的计时器需要超越您的Activity的生命周期,那么它不属于那里。您当然可以将它放入Service或另一个可以驻留在内存中的对象(如单例)。

+0

在这种情况下,什么是最好的:单身或服务? – fonini 2012-07-18 17:01:16

+0

无论适合您的应用程序。没有对错。服务很好,因为系统仍然可以管理他们的生命周期,但这可能超出了您的应用程序所希望的范围。 – Devunwired 2012-07-18 17:01:41

0

我认为应该可以将倒数计时器放入服务中。您可以通过向服务发送意向来启动定时器。此外,你将不得不使用一些机制,如回调或意图或信使将更新时间传递回您的用户界面。

0

覆盖后退按钮,然后使其表现得像主页按钮。这样你的活动永远不会被破坏。这就是说,我不认为这被认为是“良好的做法”。

要做我说的只是把它放到你的活动课上。

@Override 
public void onBackPressed() { 
    moveTaskToBack(true); 
} 

不管你做什么,作为优化,您应该确保TextView的未更新,如果TextView的是不显示在屏幕上。这应该可以节省电池寿命,并且可能会阻止创建会减少垃圾收集的字符串。

1

正如prashant和Devunwire指出的那样,您需要使用服务。确保在绑定之前调用startService(),即使调用Activity被销毁,这也会导致Service保持活动状态。

确保服务在计时器结束后自行停止,并执行任何其应有的操作。

+0

编辑:我不会覆盖后退按钮,因为你无法正确关闭你的应用程序。 – 2012-07-18 17:16:45

+0

我将计时器移至服务,但TextView未更新。如果我在服务中执行cron.getText(),它将打印该值。但在用户界面中,它不会更新。 – fonini 2012-07-18 17:28:53

+0

嗯,我不确定。如果你在服务中获得了价值,你显然可以访问这个小部件......也许你需要在视图上调用'invalidate()'。我使用Messenger将消息从服​​务发送到活动,但该应用程序不是时间关键的。你应该试试它有多快。告诉我你的结果! – 2012-07-18 17:41:09

相关问题