0

在我的应用程序中,我试图获取用户的当前位置并记录它。用户可以选择一个间隔。现在日志记录并没有持续发生。有时日志只关闭几秒钟,有时它们关闭几个小时。此外,如果它没有记录并且您关闭/打开 GPS,那么它将重新开始工作。整个应用程序基于这样一个想法,即您只能在使用 GPS 时获取您的位置。关于为什么会这样,我有一些理论。

我通过在广播接收器中使用 AlarmManager setExact 来获取日志。我知道这不能保证完全准确,可能会在这里和那里花费几秒钟。

我也知道 GPS 可能需要一些时间才能获取。这个时间有正常范围吗。我可以看到这可能需要几分钟,但几个小时似乎很多。

我对 Loopers 了解不多,并且在理解它们时遇到了一些困难。我想知道 requestSingleUpdate 中的循环器是否与它有关

    locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, this, Looper.myLooper());

我知道 loopers 使用队列在后台处理任务,我不确定其他任务是否会卡在它前面的队列中导致延迟。

我的最后一个理论是,它与搜索 GPS 信号时没有超时有关。如果我每 10 秒搜索一次信号(允许的最快),但手机找不到信号,AlarmManager 将再次触发,我将有两个服务尝试获取信号。我真的不明白这些服务是如何在幕后工作的,所以我不知道这是否可能。

如果有人有任何想法/资源并且可以指出我正确的方向,我将非常感激。

这是代码。如果有帮助,我可以包括更多。

 @Override
public void onReceive(Context context, Intent intent) {

    SharedPreferences pref = context.getSharedPreferences(SettingsActivity.PREFERENCES, Context.MODE_PRIVATE);

    if(!pref.getBoolean(SettingsActivity.ARG_TRACK, true)){
        return;
    }

    alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    Intent alarmIntent = new Intent(context.getApplicationContext(), AlarmReceiver.class);
    pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);

    long interval = pref.getLong(SettingsActivity.ARG_TRACKER_INTERVAL, 15000);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        alarmMgr.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+interval, pendingIntent);
    }else{
        alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);
    }

    context.startService(new Intent(context.getApplicationContext(), AlarmService.class));
}

在我的服务中,我正在调用 LocationManager requestSingleUpdate()

    locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, this, Looper.myLooper());
4

1 回答 1

0

在我的应用程序中,我试图获取用户的当前位置并记录它。用户可以选择一个间隔。现在日志记录并没有持续发生。有时日志只关闭几秒钟,有时它们关闭几个小时。此外,如果它没有记录并且您关闭/打开 GPS,那么它将重新开始工作。整个应用程序基于这样一个想法,即您只能在使用 GPS 时获取您的位置。关于为什么会这样,我有一些理论。

如果我没有犯错,在您的情况下,间隔不是位置提供者的时期。直接就是警戒期。这样的故事

  • 用户选择一个间隔(周期),例如 10 分钟。
  • 10 分钟后(大约),设备唤醒并发出位置请求以接收单个位置。

在这种情况下,您将面临 gps 提供商的滞后。因此,每次醒来时,您都在等待 gps 提供商暖和起来。这就是日志不一致的原因。

我通过在广播接收器中使用 AlarmManager setExact 来获取日志。我知道这不能保证完全准确,可能会在这里和那里花费几秒钟。

您正在使用准确的唤醒设置。这不是长期滞后的实际原因。

我也知道 GPS 可能需要一些时间才能获取。这个时间有正常范围吗。我可以看到这可能需要几分钟,但几个小时似乎很多。

您必须等到 GPS 提供商变热。这个变暖时间可能会因您此时停留的位置而改变。如果您在建筑物内,则需要很长时间

我对 Loopers 了解不多,并且在理解它们时遇到了一些困难。我想知道 requestSingleUpdate 中的循环器是否与它有关

简单地说,当你在这里传递一个线程的 looper 时,onLocationChanged() 方法将用于 looper。但是您已经提出了一个请求。不会触发更多更新。(在您的场景中,每次唤醒都是一个位置请求)

我的最后一个理论是,它与搜索 GPS 信号时没有超时有关。如果我每 10 秒搜索一次信号(允许的最快),但手机找不到信号,AlarmManager 将再次触发,我将有两个服务尝试获取信号。我真的不明白这些服务是如何在幕后工作的,所以我不知道这是否可能。

这是您的方案的问题。如果你设置了短时间的闹钟,那么下次醒来可能会发生是很正常的。您可以关注以下内容

  • 由于要等到gps变热,所以至少5分钟的长警报周期
  • 制作超时场景,例如等待 1 分钟或更长时间直到接收位置。
  • 如果无法及时接收位置,请关闭所有内容并等待下一次唤醒。
于 2016-05-29T02:56:14.563 回答