定期呼叫Android服务[GoodApporach?]

定期呼叫Android服务[GoodApporach?],android,Android,我的要求是 Android应用程序必须每一小时(可配置)向服务器发送用户位置详细信息(纬度和经度) 我采用的方法是使用alarm manager,我将按配置的时间间隔调用我的服务,该服务将向服务器发送位置详细信息,而不管应用程序是否正在运行 这是一个好方法吗?是的,使用AlarmManager是一个好方法 Alarm Manager适用于希望在特定时间运行应用程序代码的情况,即使应用程序当前未运行。对于正常的计时操作(滴答声、超时等),使用处理程序更容易、更高效 请参考此在UI线程上运行的And

我的要求是

Android应用程序必须每一小时(可配置)向服务器发送用户位置详细信息(纬度和经度)

我采用的方法是使用alarm manager,我将按配置的时间间隔调用我的服务,该服务将向服务器发送位置详细信息,而不管应用程序是否正在运行


这是一个好方法吗?

是的,使用AlarmManager是一个好方法

Alarm Manager适用于希望在特定时间运行应用程序代码的情况,即使应用程序当前未运行。对于正常的计时操作(滴答声、超时等),使用处理程序更容易、更高效


请参考此在UI线程上运行的Android服务,这样您就不应该在其中执行长时间运行的任务,比如向服务器发送数据。您可以使用ScheduledThreadPoolExecutor或AlarmManager来调度和使用asynctask或任何其他后台线程将数据发送到服务器

我更喜欢ScheduledExecutorService,因为它更容易用于后台任务

AlarmManager:

只要报警接收器的onReceive()方法正在执行,报警管理器就会保持CPU唤醒锁。这保证了在您处理完广播之前,手机不会休眠。onReceive()返回后,报警管理器将释放此唤醒锁。

ScheduledThreadPoolExecutor:

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

您可以在这里看到完整答案=>和


对于重复的任务,我更喜欢
定时器

TimerTask timerTask = new TimerTask() {
    @Override
    public void run() {
        process();
    }
};

Timer mTimer = new Timer();
mTimer.schedule(timerTask, 0,60*60*60*1000);

我个人使用定时器,但在进一步研究之后,我将切换到ScheduledThreadPoolExecutor。是的,这是一个很好的方法。
TimerTask timerTask = new TimerTask() {
    @Override
    public void run() {
        process();
    }
};

Timer mTimer = new Timer();
mTimer.schedule(timerTask, 0,60*60*60*1000);