我搜索了很多,我并不完全无能为力。我已经实现了一个临时解决方案但是想知道是否有更好的方法。
我有一个应用程序,每隔60秒就会将一个人的位置发送到服务器。在我的仪表板(应用程序启动后将转到 onPause 的主屏幕)上,我已使用以下代码注册 LocationManager :
service = (LocationManager) getSystemService(LOCATION_SERVICE);
boolean enabled = service
.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (!enabled)
{
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}
else
{
Criteria criteria = new Criteria();
provider = service.getBestProvider(criteria, false);
service.requestLocationUpdates(provider, 10000, 50, this);
Location location = service.getLastKnownLocation(provider);
// Initialize the location fields
if (location != null)
{
onLocationChanged(location);
}
else
{
Log.d("Location: ", "No update received");
}
}
但是,正如我所提到的,用户将最小化此活动(通过按主页按钮)。每隔60秒就会有一个由AlarmManager调用的服务。该服务从Dashboard Activity(lat,lon)访问静态变量并将其发送到服务器。
我的问题:
如果活动为onPause,requestLocationUpdates函数会停止吗?或者它会继续工作吗?
如果它继续工作,它将继续更新两个lat和lon静态String对象,服务将不断获取更新值。如果他们停止,服务将一次又一次地获得相同的旧值。
此外,有没有更好的方法来解决这个问题?使用GPS提供商和网络提供商的混合? (我需要相当准确的数值)。
修改
这是我的闹钟。此代码位于登录活动
中Intent i = new Intent(con, LocationPoller.class);
i.putExtra(LocationPoller.EXTRA_INTENT, new Intent(con,
Login.class));
i.putExtra(LocationPoller.EXTRA_PROVIDER,
LocationManager.GPS_PROVIDER);
gps = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
PendingIntent pi = PendingIntent.getBroadcast(con, 0, i, 0);
gps.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(),
10 * 1000, pi);
Log.d("Service: ",
"GPS Service started and scheduled with AlarmManager");
这是我的接收者(也在登录活动中)
private class ReceiveMessages extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Location loc = (Location) intent.getExtras().get(
LocationPoller.EXTRA_LOCATION);
String msg;
if (loc == null)
{
msg = intent.getStringExtra(LocationPoller.EXTRA_ERROR);
}
else
{
msg = loc.toString();
}
if (msg == null)
{
msg = "Invalid broadcast received!";
}
Log.d("GPS Broadcast: ", msg);
}
}
什么都没发生:s没有在logcat上得到任何东西,这意味着没有收到广播。
答案 0 :(得分:1)
当活动暂停时,所有已注册的听众都将停止。实现这一点的更好方法是,警报管理器每隔60秒发送一次广播,此广播接收器启动服务,此服务将在Wakeful线程上请求一个位置,一旦检索到位置信息,就更新服务器上的位置。
有一个开源库可以举例(CommonsWare提供),请参考下面的链接。它在Apache 2.0许可下
请使用上面的库查找我的示例项目。我在上面的库中修改了一些东西并创建了我自己的版本。