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

时间:2013-04-09 13:55:28

标签: android service background alarmmanager locationmanager

情景:

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

当前实施;

服务类;

  1. 位置监听器,间隔为30秒,设置经度&纬度值为两个局部变量
  2. 警报管理器每30秒向广播接收器发出一次待处理的意图。
  3. 广播接收器在附加内容中启动带有位置变量的IntentService。
  4. IntentService http发布位置并询问来自服务器的任何新数据。
  5. IntentService通过广播接收器将服务器响应发送回主服务类。

    • 服务类starts_sticky以确保操作系统重新启动。
  6. 我尝试过几种不同的变体;

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

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

    3. 问题;

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

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

      3. 您如何大力测试服务类,尤其是从操作系统中恢复而杀死它?

      4. 提前致谢。

1 个答案:

答案 0 :(得分:1)

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

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

alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+5000, 60000 * ALARM_PERIOD_IN_MINUTES, alarmPendingIntent);

而不是将其设置为时间。