17

我知道 BroadcastReceiver 会监视文本、电话事件等...但是您可以将 LocationServices 作为基于位置的服务和事件运行吗?

例如,您在某个 GPS 点附近,手机会通知您。

4

2 回答 2

36

我认为您正在寻找的是这样的东西。有一个版本LocationManager.requestLocationUpdates()将 aPendingIntent作为参数,并且此 Intent 可用于触发 a BroadcastReceiver。此代码将注册一个自定义广播以随位置更新触发。

Intent intent = new Intent("UNIQUE_BROADCAST_ACTION_STRING_HERE");
LocationManager manager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
long minTime;     //This should probably be fairly long
float minDistance; //This should probably be fairly big
String provider;   //GPS_PROVIDER or NETWORK_PROVIDER

PendingIntent launchIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
manager.requestLocationUpdates(provider, minTime, minDistance, launchIntent);

然后,您只需BroadcastReceiver使用相同的 Intent 操作注册您的操作,它将接收位置更新以进行处理。而且,当然,请保留它PendingIntent,因为您需要manager.removeUpdates(launchIntent)在某个时候打电话!

最后注:

因为听起来您正在尝试在您的应用不在前台时执行定期位置更新,所以请记住这一点。除非您希望您的应用程序被标记为电池杀手,否则在实现此功能时要格外小心。

您将希望使用较大的 minTime 或 minDistance 参数大大降低位置更新的频率,以允许位置服务停止。此功能还应附加到用户控制的首选项,以便他们可以启用/禁用您的应用在后台跟踪位置。

希望有帮助!

于 2011-03-09T02:52:15.723 回答
22

这个问题已经超过 2 年了,但现在有一种非常简单且电池效率高的方法来做到这一点。这个概念被称为地理围栏。您可以在下面更详细地了解它:

http://developer.android.com/training/location/geofencing.html

于 2013-08-01T11:44:49.663 回答