AlarmManager而不是后台服务?对于重复的任务

时间:2015-09-29 03:59:30

标签: android android-service alarmmanager android-alarms

操作系统始终可以关闭服务。因此,它们对我来说似乎不如AlarmManager。我必须每1-2秒定期更新一次。在服务或AlarmManager中使用后台线程是否更好?由于有方法可以在不唤醒应用程序的情况下使用AlarmManager。见http://vikinghammer.com/2012/04/22/android-use-alarmmanager-instead-of-a-service-with-a-timertask/

我想知道Timer,Thread和Service代码有什么优势?我认为我对AlarmManager的一个想法是任务代码必须在某处执行,因此在接收到它时,BroadcastReceiver似乎是执行代码的错误位置。如何传递给IntentService?这比开始运行的后台服务中的所有线程管理的开销更高吗?如果没有AlarmManager,我们如何保证后台服务真正保持正常运行?

为了澄清,我的应用程序将在后台运行,而其他应用程序可以由用户运行。我会阻止他们中的一些,但让别人跑很长时间。因此,我不认为每2秒进行一次服务检查,保证在用户与其他应用程序交互时保持服务。但是如果报警经理,我可以保证检查总是做对吗?

1 个答案:

答案 0 :(得分:1)

我不确定,但据我所知,我赞同我的观点。如果我错了,我总是接受最好的答案。

警报管理器

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

注意:警报管理器适用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前未运行也是如此。对于正常的计时操作(刻度,超时等),使用Handler会更容易,也更有效。

定时器

timer = new Timer();

timer.scheduleAtFixedRate(new TimerTask() {

    synchronized public void run() {

        \\ here your todo;
        }

    }}, 60000, 60000);

Timer有一些由ScheduledThreadPoolExecutor解决的缺点。所以这不是最好的选择

的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。

警报管理器适用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前未运行也是如此。 请注意,如果您计划在应用程序关闭时进行更新,则每十分钟一次是非常频繁的,因此可能有点过于耗电。

来源:Scheduling recurring task in Android