我有一个小部件,当按下它时,会发送一个广播,启动一个更新我的小部件的CountDownTimer,最后播放一个警报。这在模拟器中运行得很漂亮。
然而,在我的手机上,这是一个不同的故事。我的手机受资源限制,我的进程会被定期杀死,这当然意味着CountDownTimer不再更新我的小部件。
似乎是将来可靠地执行操作的唯一方法是使用AlarmManager,因为这会设置系统级警报。但是,文档声明并且我同意,您不应该将它用于刻度线。但是,由于您可能使用的任何其他东西都有可能被任意关闭,因此它们并没有给我们太多选择。
我的问题是:有没有办法确保CountDownTimer保持滴答声并最终调用onFinish(),或者我必须简单地删除它并切换到AlarmManager,并“滥用”它?我们也欢迎任何其他保证物品滴答和完成的选择。
我应该补充一点,我不能依赖操作系统调用onUpdate(),因为它不会比每30分钟更快,而且因为大部分时间小部件什么都不做。只有当它被点击时,它才会在几秒钟内每秒钟滴答一次。
答案 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
。