4

设想:

长时间(即 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. 您如何大力测试服务类,尤其是从操作系统杀死它的恢复方面?

提前致谢。

4

1 回答 1

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);

而不是将其设置为时间。

于 2013-04-09T15:11:14.923 回答