如何确保CountDownTimer打勾并完成?

时间:2012-03-29 11:23:36

标签: android android-widget

我有一个小部件,当按下它时,会发送一个广播,启动一个更新我的小部件的CountDownTimer,最后播放一个警报。这在模拟器中运行得很漂亮。

然而,在我的手机上,这是一个不同的故事。我的手机受资源限制,我的进程会被定期杀死,这当然意味着CountDownTimer不再更新我的小部件。

似乎是将来可靠地执行操作的唯一方法是使用AlarmManager,因为这会设置系统级警报。但是,文档声明并且我同意,您不应该将它用于刻度线。但是,由于您可能使用的任何其他东西都有可能被任意关闭,因此它们并没有给我们太多选择。

我的问题是:有没有办法确保CountDownTimer保持滴答声并最终调用onFinish(),或者我必须简单地删除它并切换到AlarmManager,并“滥用”它?我们也欢迎任何其他保证物品滴答和完成的选择。

我应该补充一点,我不能依赖操作系统调用onUpdate(),因为它不会比每30分钟更快,而且因为大部分时间小部件什么都不做。只有当它被点击时,它才会在几秒钟内每秒钟滴答一次。

3 个答案:

答案 0 :(得分:0)

我认为这是一个解决方案..创建虚拟服务..

public class DummyService extends Service{


@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}
 @Override
    public void onCreate() {
        super.onCreate();

    }
    @Override
    public void onDestroy() {

        super.onDestroy();

    }
}

并使用countdowntimer从你的活动开始,就像这样......在活动的创建中

Intent intent = new Intent(this,  DummyService.class);
startService(intent);

并且也不要忘记在你的清单中声明这个服务..

<service android:name=".DummyService" >
</service>

希望这会有所帮助..

答案 1 :(得分:0)

我最终做的是从BroadcastReceiver转移到服务。 不只是使用虚拟服务,而是拥有真实的服务体现了BroadcastReceiver之前的工作。

由于这不能保证我的计时器不会被杀死,如果请求,android会在它被杀死后自动尝试重启你的服务。在这种情况下,我计划有一些代码可以从磁盘恢复运行状态并继续。

答案 2 :(得分:0)

要添加到the accepted answer:根据我的记忆,BroadcastReceiver只会在处理广播时生效。

因此,在BroadcastReceiver内启动计时器或其他内容将无效(如上所述)。

这就是为什么建议使用BroadcastReceiver启动将执行计时的Service。当然,服务仍然可以被杀死,但不能早于BroadcastReceiver