Android开发者-报警管理器与服务

Android开发者-报警管理器与服务,android,alarmmanager,Android,Alarmmanager,我正在制作一个需要每小时执行一个功能的应用程序,即使该应用程序已关闭 首先,我想创建一个服务,但在我的测试中,我意识到android有时会杀死我的服务。所以我在寻找另一个解决方案,我找到了AlarmManager。我已经实现了它,它似乎可以工作,但我怀疑它是否会发生同样的服务或它将永远运行?(直到手机重新启动…) 另一个问题是,需要创建一个新线程来在alarm manager中执行该进程,还是直接在其他线程中运行 我已经实现了它,它似乎可以工作,但我怀疑它是否会发生同样的服务或它将永远运行?(直

我正在制作一个需要每小时执行一个功能的应用程序,即使该应用程序已关闭

首先,我想创建一个服务,但在我的测试中,我意识到android有时会杀死我的服务。所以我在寻找另一个解决方案,我找到了AlarmManager。我已经实现了它,它似乎可以工作,但我怀疑它是否会发生同样的服务或它将永远运行?(直到手机重新启动…)

另一个问题是,需要创建一个新线程来在alarm manager中执行该进程,还是直接在其他线程中运行

我已经实现了它,它似乎可以工作,但我怀疑它是否会发生同样的服务或它将永远运行?(直到手机重新启动…)

它将运行到:

  • 如您所述,设备已重新启动,或者
  • 用户卸载您的应用程序,或
  • 您自己取消活动,或者
  • 用户进入“设置”,在已安装应用的列表中找到您的应用,点击该条目,然后单击“强制停止”按钮
在你的应用程序升级后,可能需要再次安排警报(我忘了…)

有必要创建一个新线程以在alarm manager中执行该进程,或者它直接在其他线程中运行

除非你要做的工作只需要几毫秒,否则你需要一个后台线程。这导致了两种可能的模式:

  • 如果您没有使用
    \u WAKEUP
    -类型的报警,请使用
    getService()
    pendingent
    每小时向
    IntentService
    发送一次控制

  • 如果您使用的是
    \u WAKEUP
    类型的警报,则需要使用
    getBroadcast()
    pendingent
    ,并让它调用的子类,或者您需要自己管理
    WakeLock
    ,以便在您执行工作时保持设备处于唤醒状态


  • 不,Android不会终止定时报警,除非更换应用程序或重新启动设备,否则它们会按计划执行。使用这些事件的广播接收器重新安排警报。无法阻止强制停止,因为它会完全杀死所有应用程序组件和线程

    这取决于Alarm Manager的功能。如果发送广播,则接收器限制为10秒

    如果它启动活动、服务或意图服务,则没有限制。对于活动和服务,您必须完成或停止它;对于意图服务,您必须完成或停止它,直到流程完成。请注意,在Intent服务中不能有其他线程,并且只能在OnHandleIntent中编写代码

    也必须考虑设备状态。如果是睡眠,并且您正在使用唤醒标志接收器,则不需要唤醒锁,但其他接收器需要。设备很快就会恢复睡眠


    不要将系统资源浪费在服务上,因为Alarm Manager会执行您想要的操作。

    此外,如果您希望它在设备重新启动时不会停止,您可以使用
    BOOT_COMPLETED
    intent过滤器在
    manifest
    中注册它,以便在设备启动后再次启动rebooted@CommonsWare在升级的情况下,闹钟应用程序不会因为不能自动重新启用而无用吗?我的意思是,你写到升级后,alarmManager会取消与应用程序相关的一切,对吗?关于在后台运行的解决方案,您是否有每个解决方案的示例代码?@androiddeveloper:“在升级的情况下,闹钟应用程序不会因为无法自动重新启用而无用吗?”——如果有必要,请收听
    操作\u包\u更改的
    。“你写的升级后,alarmManager会取消与应用程序相关的所有内容,对吗?”--不,这不是我写的。我写道:“在你的应用程序升级后,可能需要再次安排警报(我忘了…)。(重点补充)“关于在后台运行的解决方案,你有没有每个解决方案的示例代码?”--我不知道你在说什么。@Commonware ACTION\u PACKAGE\u CHANGED是禁用启用的,没有?我想你指的是被替换的行动包。问题是,当前应用程序是否会在升级后立即收到通知。无论如何,对不起,我误解了你的意思。关于另一件事,我是说关于你答案的最后一部分。您有两个项目,每个项目都涉及不同的解决方案。我问你是否知道每一个的示例。@androiddeveloper:实际上,我认为正确的示例是
    操作\u我的\u包\u替换的
    ,这是API级别12的新示例,进一步表明应用程序的警报在升级时是单独存在的。“我问你是否知道每一个的样品”--和