Android - 周期性服务的最佳实践

3
我希望能够实现一个服务,其工作是定期从互联网上获取更新。我知道有几种方法可以实现这个目的,以下列出其中两种,请告诉我哪一种更有效,并在实践中哪种方式更常见。提前感谢。
1. 在单独的线程中实现一个无限循环 while(true),然后在服务的 onStartCommand 中运行此线程。伪代码如下:
class Updater extends Service {
    ...
    public int onStartCommand(Intent intent, int flags, int startId) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){

                    // fetching update...

                    Thread.sleep(FOR_A_WHILE);
                }
            }
        }).start();
    }
    ...
}

2.定时触发AlarmManager,以周期性方式触发一个IntentService来获取更新。


可能是在后台定期轮询Android应用程序的最佳方法的重复问题。 - ntv1000
2个回答

5
在服务的onStartCommand中实现一个无限循环while(true)线程,然后运行此线程。更好的实现方式是使用ScheduledExecutorService。
两种实现方法并不相同,因此你正在比较不同的事物。第一种方法 -- 无论是使用Thread.sleep()还是ScheduledExecutorService -- 的意思是“在进程运行和设备唤醒时,每N毫秒做一些事情”。第二种方法的意思是“每N毫秒做一些事情,不管进程的状态如何(甚至如果设备休眠),直到我告诉你停止为止。”因此,如果只需要在进程运行时完成工作,可以使用第一种方法。在其他情况下,应该使用第二种方法。

谢谢您的回复,我的目的是实现一个服务,它像闹钟服务一样始终运行,即使设备处于睡眠状态也必须运行。在这种情况下,您能否帮助我确定哪种方法更好? - frogatto
@ABFORCE:你的第二选择(AlarmManager)是唯一可行的选择。因此,根据定义,它比那些行不通的方法更好。 - CommonsWare
谢谢您的帮助,您的答案对我非常有帮助! - frogatto

2

这两种方法都可以。但我更倾向于使用第二种方法,因为在第一种方法中,您的服务可能会被系统强制关闭(特别是在低内存的低端设备上),而在此时服务正要重新启动线程更新信息,因此您会错过此次更新。是的,当内存可用时(创建服务时必须确保这一点),它将在稍后触发,但我只是想说,归根结底,是否跳过任何更新取决于对您的重要性。


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