在我的应用程序中,我试图获取用户的当前位置并记录它。用户可以选择一个间隔。现在日志记录并没有持续发生。有时日志只关闭几秒钟,有时它们关闭几个小时。此外,如果它没有记录并且您关闭/打开 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());