我从Googles LocationUpdatesPendingIntent示例开始。 我已将位置内容从主要活动移动到onBoot广播接收器,因为我需要在设备启动时立即启动位置更新。这非常有效,并在状态栏中提供通知。
但是,如何在活动中打开和关闭位置更新?
这是用于投票的车辆位置。
这是我的BroadcastReceiver:
public class StartupComplete1 extends BroadcastReceiver {
private static final long UPDATE_INTERVAL = 10000; // Every 10 seconds.
private static final long FASTEST_UPDATE_INTERVAL = 5000; // Every 5 seconds
private static final long MAX_WAIT_TIME = UPDATE_INTERVAL * 2; // Every 20 seconds.
private LocationRequest mLocationRequest;
private FusedLocationProviderClient mFusedLocationClient;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equalsIgnoreCase(Intent.ACTION_BOOT_COMPLETED)) {
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(context);
createLocationRequest();
try {
mFusedLocationClient.requestLocationUpdates(mLocationRequest, getPendingIntent(context));
} catch (SecurityException e) {
Toast.makeText(context, "Error - Cant start location updates", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
}
private PendingIntent getPendingIntent(Context context) {
Intent intent = new Intent(context, LocationUpdatesBroadcastReceiver.class);
intent.setAction(LocationUpdatesBroadcastReceiver.ACTION_PROCESS_UPDATES);
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
private void createLocationRequest() {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(UPDATE_INTERVAL);
mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setMaxWaitTime(MAX_WAIT_TIME);
}
答案 0 :(得分:1)
开始检查广播接收器中的位置更新并不是一个好主意。基于android documentation用于广播接收器
作为一般规则,广播接收器允许运行最多10秒,然后系统才会认为广播接收器无响应且ANR应用程序。由于这些通常在应用程序的主线程上执行,因此它们已经受到可能发生的各种操作的约5秒时间限制(更不用说仅仅避免UI jank),因此接收限制通常不受关注。但是,一旦你使用goAsync,虽然能够脱离主线程,广播执行限制仍然适用,包括调用此方法和最终PendingResult.finish()之间所花费的时间。
当位置更新需要更长的响应时间时,这可能会导致ANR,尤其是在室内时。
您应该在Boot completed broadcast接收器的onReceive()上启动粘性服务。然后,MainActivity可以绑定到此服务以执行必要的操作。
如果您定位Android O,则此方法可能会出现问题。请查看this post,其中说明Android O上的背景位置收集。