我有一个应用程序,用户可以在其中创建多个倒计时警报。每个人都有自己的名字,计时,铃声等等。
我扩展了CountDownTimer来保存每个警报设置,并创建了一个Singleton管理器来管理所有警报。
在离开应用程序之前,一切正常。
计数器实际上并没有死亡。他们有一种奇怪的行为。启动柜台后: 1)如果我按回键直到主屏幕然后关闭屏幕,警报将按原样触发。 2)如果我按下主页按钮然后关闭屏幕它将仅在我打开应用程序时触发。 3)如果我只是在应用程序上关闭屏幕,它会在我打开屏幕时立即触发。 我预计会遇到麻烦,因为我需要使用服务,处理程序或其他类似的东西。
问题是,我是Android新手,经过大量阅读后,我找不到解决方案。
据我所知,我应该使用服务,但它只能有一个实例。我如何处理多个警报?
还有其他办法吗?
我需要一种方法来启动每个警报并告诉系统不管发生什么事情都要继续计算! (并在完成后调用活动)
任何帮助?
答案 0 :(得分:4)
还有其他办法吗?
如果您的目标是在将来向用户发出事件警报,无论您的应用是否正在运行,请转储所有CountdownTimer
逻辑,然后切换到AlarmManager
。它专为此类场景而设计。您可以为每个计时器设置AlarmManager
事件,以便在到达结束时间时获得控制权。
另请注意,您需要在文件或数据库中维护有关已注册事件的信息:
因此用户可以添加和删除它们,
因此,如果用户重新启动设备,您可以再次设置AlarmManager
并在完成后调用
用户可以针对该行为拒绝您的应用。不是每个人都希望在他们使用他们的设备做的事情中被打断。请允许这是可配置的,因此用户可以选择较少侵扰性的内容,例如Notification
。
答案 1 :(得分:1)
你应该用AlarmManager
替换你的CountdownTimers(如在CommonsWare的回答中),在设置之后它将触发你的功能在指定的时间执行,这是官方指南:
http://developer.android.com/training/scheduling/alarms.html
很快您会发现设备重启后您的闹钟丢失,您需要通过抓取android.intent.action.BOOT_COMPLETED
广播来重启它们。
此外,您不应该在闹钟onReceive中做很多工作,您应该将信息传递给其他组件,例如IntentService
,以便在设备处于睡眠状态时使其安全,您应该使用WakeLock
({ {3}})。
[edit] ----你还应该将你的闹钟/铃声相关数据存储在一些持久存储中,你可以使用它来共享首选项,或者(更多工作)sqlite数据库。
答案 2 :(得分:0)
我真的想要使用计时器(即当你想在屏幕上显示倒计时时): 您不必拥有多个计时器来显示多个倒计时。
您需要做的就是将目标时间放入某个集合中,或将事件放入View.setTag()。
然后你有计时器(比如1s勾选) - 在每一个刻度上你必须迭代你的所有仪表,检查目标时间和当前时间,解析数字并调整仪表。
但是 - 由于计时器在单独的(非主要)线程上工作 - 你将不得不使用处理程序或类似的东西。 如果你想设置一些警报 - 采取CommonsWare的答案 - 这是一个很好的。