7

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

  1. ScheduledExecutorService

  2. 报警管理器

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

4

1 回答 1

11

报警管理器

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

调度线程池执行器。

您可以使用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。

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

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

也看看这篇文章。

于 2014-05-28T06:58:59.077 回答