2012-03-29 61 views
1

我有一个小部件,按下后会发送一个广播,启动一个CountDownTimer更新我的小部件,并在最后播放警报。这在仿真器中很漂亮。我如何确保CountDownTimer滴答并完成?

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

看来,未来可靠地做事的唯一方法是使用AlarmManager,因为这会设置系统级别的警报。但是,文档陈述并且我同意,你不应该使用它作为蜱。但是,由于您可能使用的任何其他东西都有可能被任意关闭,所以它们并没有给我们太多选择。

我的问题是:有没有办法确保CountDownTimer保持滴答状态并最终调用onFinish(),还是我必须简单地删除它并切换到AlarmManager并“误用”它?任何其他保证东西剔除和完成的选项也是受欢迎的。

我应该补充一点,我不能依靠调用onUpdate()的操作系统,这两者都是因为它每隔30分钟就会这样做,并且也是因为大部分时间部件什么都不做。只有当它被点击时,它会在几秒钟内每秒钟滴答下来。

回答

0

我最终做的是从BroadcastReceiver转移到服务。 不只是使用虚拟服务,而是让真正的服务体现了BroadcastReceiver之前的做法。

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

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这样从活动开始吧..在OnCreate中活动的

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

和也不要忘了在你的清单中宣布这项服务,像这样..

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

希望这有助于..

+0

这会完成什么? – 2012-03-29 11:43:54

+0

虽然服务仍然可能被杀害。此外,具有CountDownTimer的东西不是一个活动,它是一个BroadcastReceiver,但也许这并不重要。我们基本上将该服务用作主播。不过,我知道会发生什么。客户仍然会抱怨,偶尔倒计时不会奏效。 – 2012-03-29 12:10:47

+0

实际上,与此相结合的服务可能是票据:http://stackoverflow.com/questions/3856767/android-keeping-a-background-service-alive-preventing-process-death – 2012-03-29 12:22:15

0

要添加到the accepted answer:从我记得,BroadcastReceiver只有处理广播需要的时间。

因此,从BroadcastReceiver内启动计时器或其他东西将不起作用(如上所述)。

这就是为什么建议使用BroadcastReceiver来启动Service这将做的时间。当然,该服务仍然可以被杀死,但不会早于BroadcastReceiver