【问题标题】:Location Updates on Boot - turn on and off in activity启动时位置更新 - 在活动中打开和关闭
【发布时间】:2018-03-22 08:45:50
【问题描述】:

我从 Google 的 LocationUpdatesPendingIntent 示例开始。 我已将位置信息从 Main Activity 移至 onBoot 广播接收器,因为我需要在设备启动时立即开始位置更新。这完美地工作并在状态栏中提供通知。

但是我该如何从 Activity 开启和关闭位置更新?

这是用于轮询车辆位置。

这是我的广播接收器:

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

【问题讨论】:

    标签: android location


    【解决方案1】:

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

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

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

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

    如果您以 Android O 为目标,这种方法可能会出现问题。请查看 this post,其中解释了 Android O 上的后台位置收集。

    【讨论】:

    • 谢谢。所以我把我所有的位置逻辑放在一个类中,然后像这样从广播接收器开始? Intent serviceIntentLocation = new Intent(context, LocationHelper.class); context.startService(serviceIntentLocation);
    • 是的。您的 LocationHelper 应该扩展服务。您可以关注developer.android 将服务绑定到您的活动
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多