【问题标题】:Which is Better ScheduledExecutorService or AlarmManager in android?android 中的 ScheduledExecutorService 或 AlarmManager 哪个更好?
【发布时间】:2014-07-09 14:18:00
【问题描述】:

我是一个初学者,我正在开发一个 android 应用程序,它会在一定的延迟(以天为单位)后继续向用户发送 SMS。我希望用户一旦注册就应该收到 SMS,而不管事实如何他是否登录。短信内容和手机号码都是从数据库中获取的,所以研究了一下发现了两种方法

  1. ScheduledExecutorService

  2. 报警管理器

问题是alarmManager会在手机关机或重启时关闭。 ScheduledExecutorService 也是这种情况吗?在使用 Executor Service 时,我应该在 ThreadPool 中使用多少个线程?

【问题讨论】:

    标签: android alarmmanager scheduledexecutorservice


    【解决方案1】:

    报警管理器

    只要警报接收器的onReceive() 方法正在执行,警报管理器就会持有 CPU 唤醒锁。这保证了在您完成广播处理之前手机不会休眠。一旦onReceive() 返回,警报管理器就会释放这个唤醒锁。这意味着在某些情况下,只要您的 onReceive() 方法完成,手机就会进入睡眠状态。如果您的报警接收器呼叫Context.startService(),则手机可能会在请求的服务启动之前休眠。为防止这种情况发生,您的BroadcastReceiver 和服务将需要实施单独的唤醒锁定策略,以确保手机继续运行直到服务可用。

    ScheduledThreadPoolExecutor。

    您可以使用java.util.Timer or ScheduledThreadPoolExecutor(首选)安排在后台线程上定期执行的操作。

    这是使用后者的示例:

    ScheduledExecutorService scheduler =
        Executors.newSingleThreadScheduledExecutor();
    
    scheduler.scheduleAtFixedRate
          (new Runnable() {
             public void run() {
                // call service
             }
          }, 0, 10, TimeUnit.MINUTES);
    

    所以我更喜欢 ScheduledExecutorService

    但如果更新将在您的应用程序运行时发生,您可以使用计时器(如其他答案中所建议的那样)或更新的 ScheduledThreadPoolExecutor。如果您的应用程序即使在未运行时也会更新,您应该使用 AlarmManager。

    警报管理器适用于您希望应用程序代码在特定时间运行的情况,即使您的应用程序当前没有运行。

    请注意,如果您打算在应用程序关闭时更新,则每十分钟更新一次是相当频繁的,因此可能有点太耗电了。

    还可以查看this 的帖子。

    【讨论】:

    • 设备启动或关闭时,ScheduledExecutor 是否会关闭。我最近读到,通过使用 我们可以在用户重新启动设备时自动重新启动重复警报,这确保 AlarmManager 将继续执行其任务而无需用户需要手动重启警报。那我应该用什么?
    • 它肯定会消失...尝试阅读文档developer.android.com/reference/android/content/…
    • wake 和 ScheduledExecutorService 怎么样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 2011-02-22
    • 2013-06-06
    相关资源
    最近更新 更多