在安卓开发中,使用ScheduledExecutorService和AlarmManager哪个更好?

7
我是一名初学者,正在开发一款Android应用程序,它将在一定延迟后(以天为单位)不断向用户发送短信。我希望用户注册后无论是否登录都能收到短信。短信内容和手机号码从数据库中获取。经过研究,我发现了两种方法:
  1. ScheduledExecutorService
  2. AlarmManager
问题在于,当手机关闭或重新启动时,AlarmManager会关闭。在使用Executor Service时,应该使用多少个线程?ScheduledExecutorService也会像AlarmManager一样关机吗?
1个回答

10

闹钟管理器

闹钟管理器在执行闹钟接收器的onReceive()方法时会持有CPU唤醒锁。这可以确保手机在处理广播之前不会休眠。一旦onReceive()方法返回,闹钟管理器就会释放此唤醒锁。这意味着,有些情况下,当你的onReceive()方法完成后,手机将立即进入睡眠状态。如果你的闹钟接收器调用了Context.startService(),那么在请求的服务启动之前,手机可能会休眠。为了防止这种情况发生,你的BroadcastReceiver和服务需要实现独立的唤醒锁策略,以确保手机在服务可用之前继续运行。

ScheduledThreadPoolExecutor.

您可以使用java.util.Timer或ScheduledThreadPoolExecutor(推荐)在后台线程上定期安排操作。

以下是使用后者的示例:

ScheduledExecutorService scheduler =
    Executors.newSingleThreadScheduledExecutor();

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

所以我更喜欢ScheduledExecutorService。

但是如果在应用程序运行时发生更新,可以使用Timer,如其他答案中建议的,或者更新的ScheduledThreadPoolExecutor。 如果您的应用程序即使在不运行时也会更新,则应选择AlarmManager。

AlarmManager旨在用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前未运行。

请注意,如果您计划在应用程序关闭时进行更新,则每十分钟一次可能太频繁,从而可能消耗过多电量。

还请查看帖子。


ScheduledExecutor会在设备启动或关闭时触发吗?我最近读到,通过使用<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>,我们可以自动重新启动重复的闹钟,如果用户重新启动设备,则确保AlarmManager将继续执行其任务,而无需用户手动重新启动闹钟。那么我应该使用什么? - R_2293
1
它肯定会关闭... 请尝试阅读文档 http://developer.android.com/reference/android/content/BroadcastReceiver.html#ReceiverLifecycle - Rohit
那么关于 wake 和 ScheduledExecutorService 呢? - redochka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接