启动时的位置更新 - 在活动中打开和关闭

时间:2018-03-21 23:03:10

标签: android location

我从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);
}

1 个答案:

答案 0 :(得分:1)

开始检查广播接收器中的位置更新并不是一个好主意。基于android documentation用于广播接收器

  

作为一般规则,广播接收器允许运行最多10秒,然后系统才会认为广播接收器无响应且ANR应用程序。由于这些通常在应用程序的主线程上执行,因此它们已经受到可能发生的各种操作的约5秒时间限制(更不用说仅仅避免UI jank),因此接收限制通常不受关注。但是,一旦你使用goAsync,虽然能够脱离主线程,广播执行限制仍然适用,包括调用此方法和最终PendingResult.finish()之间所花费的时间。

当位置更新需要更长的响应时间时,这可能会导致ANR,尤其是在室内时。

您应该在Boot completed broadcast接收器的onReceive()上启动粘性服务。然后,MainActivity可以绑定到此服务以执行必要的操作。

如果您定位Android O,则此方法可能会出现问题。请查看this post,其中说明Android O上的背景位置收集。