我不确定我是否正在尝试正确的事情。
我想每天发布两次通知,但前提是用户选择了此选项。因此,如果用户打开复选框,则会发布两个延迟处理程序。如果用户取消选中该复选框,则两个处理程序都将被取消。它工作正常,但如果用户打开复选框,关闭应用程序,打开应用程序并关闭复选框,无论如何都会发布通知。我没有处理程序对象的原始实例,所以我无法取消它。 那么,如果我关闭应用程序并再次打开它,我怎么能得到我创建的第一个处理程序的实例?
我该怎么办?谢谢!
答案 0 :(得分:1)
鉴于你提到你不想使用闹钟管理器,因为如果你的应用程序没有运行它会触发 - 我假设你只想让你的处理程序在你的应用程序是运行
您有几个选择:
将处理程序移出活动/片段,因为它们会被销毁并重新创建,这会导致您失去对原始处理程序的跟踪。将处理程序放在一个持久对象中,例如Application子类a retained Fragment或其生命周期未绑定到活动或片段(例如单个对象)的自定义类实例。 如果应用程序被杀死并重新启动,您的处理程序将不会触发,因为没有任何内容持久存储到磁盘。
将Handler留在原处。在onStop()中调用handler.removeCallbacksAndMessages(null)。这将在将来停止Handler触发的这个实例。当然,如果重新创建Activity,您需要一种存储希望处理程序触发的日期/时间的方法。使用onSaveInstanceState()/ onRestoreInstanceState()来保持Handler应该触发的日期。在onRestoreInstanceState()中,如果找到保存的日期,则为该日期安排处理程序。 如果应用程序被杀死并重新启动,您的处理程序将不会触发,因为没有任何内容持久存储到磁盘。
与上述相同,除了将日期/时间保存到on SharedPrefs onPause()而不是使用已保存的实例状态。在onResume()中检索它并相应地调度处理程序。这意味着日期会在应用启动时保持不变。如果应用程序被杀死并重新启动,您的处理程序将在正确的时间触发。
解决方案#2和#3将导致处理程序在应用程序背景化(但仍在技术上运行)时不会触发。如果由于某种原因需要此行为,请使用#1。如果您需要交叉启动持久性,请将其与#3结合使用。但是,如果您确实希望这种行为看起来似乎正在侵犯AlarmManager领域。