Android:定期(每 30 秒)在后台发送位置数据并向服务器请求新数据

use*_*966 5 service android background alarmmanager locationmanager

设想:

长时间(即 12 小时)每 30 秒发布到服务器以在后台获取任何新数据。位置数据需要随之发送。

目前的实施情况;

服务等级;

  1. 间隔 30 秒的位置侦听器,将经度和纬度值设置为两个局部变量
  2. 警报管理器每 30 秒向广播接收器发出待处理的 Intent。
  3. 广播接收器使用额外的位置变量启动 IntentService。
  4. IntentService http 发布位置并请求来自服务器的任何新数据。
  5. IntentService 通过广播接收器将服务器响应发送回主服务类。

    • 服务类starts_sticky以确保操作系统重新启动。

我尝试了几种不同的变体;

  1. 我尝试使用 Handler 和 runnable 来处理发布到服务器的计时机制,但是,当设备处于睡眠状态时,postDelay 时间从 2 分钟变为 7 分钟。

  2. 此外,尝试直接从警报管理器触发 IntentService,但无法使用最新的位置变量更改 PendingIntent 附加内容。

问题;

  1. 目前的实施方式是可行的吗?

  2. 沿着谷歌的 GCM 路线走会更有利吗?

  3. 如何大力测试服务类,特别是从操作系统终止服务类中恢复?

提前致谢。

Edu*_*zer 1

为了避免操作系统终止您的服务,您必须通知用户您的服务是一项持续的服务,如http://developer.android.com/guide/components/services.html#Foreground中所述。

我设法使用 AlarmManager 和 WakeLock 让我的服务在后台每 2 分钟运行一次,如本答案中所述。即使设备处于睡眠状态,它也会每 2 分钟运行一次。只需将闹钟设置为重复即可

alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+5000, 60000 * ALARM_PERIOD_IN_MINUTES, alarmPendingIntent);
Run Code Online (Sandbox Code Playgroud)

而不是将其设置为时间。