在服务期间更改保险丝位置设置 运行

Change fuse location setting while service is running

您好,我正在将位置服务集成到我的应用程序中。为此,我正在使用 Google 的保险丝定位服务。

我的实现如下:

public class LocationNotifyService extends Service implements
        LocationListener,
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {

    protected void createLocationRequest() {
        mLocationRequest = new LocationRequest();
        mLocationRequest.setInterval(INTERVAL);
        mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
        mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {

        //show error dialog if GoolglePlayServices not available
        if (isGooglePlayServicesAvailable()) {
            createLocationRequest();

            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();
             mGoogleApiClient.connect();
        }
    }

    @Override
    public void onConnected(Bundle bundle) {
        Log.d(TAG, "onConnected - isConnected ...............: " + mGoogleApiClient.isConnected());
        startLocationUpdates();
    }
}

我想要实现的是当我的应用程序是 运行 我想将 LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY 更改为 LocationRequest.HIGH_ACCURACY 并且当应用程序再次处于后台时将其更改为 PRIORITY_BALANCED_POWER_ACCURACY .更新间隔也一样。如果应用程序 运行 它应该经常更新位置,当它在后台时它应该在一段时间后更新。

简而言之,这是一项服务,我想在服务 运行 时更改保险丝位置设置,而无需重新启动服务。

我很清楚应用程序是在前台还是在后台。唯一的问题是切换优先级。

您可以通过意图与您的服务进行交互来实现这一点。 unregister/register 具有所需精度的位置请求。

您可以在 activity 中实施 onPause() 方法来检测用户何时离开您的应用并执行某些操作。

onPause() is where you deal with the user leaving your activity. Most importantly, any changes made by the user should at this point be committed

在此方法中,从此处与您的服务通信(发送应用程序不再 运行 的信息) 为此,您可以使用 starService(intent)

如果此时服务不是 运行,它会启动服务,但如果服务是 运行,它不会重新启动,它只会在您的服务中调用 onStartCommand()

在服务中 - 您可以从 onStartCommand() 中的 intent extras 中获取值。

我通过创建新的 GoogleApiCLient 和新的 LocationRequest 解决了我的问题 在 onStartCommand().

当我的应用程序进入后台时,我再次启动我的服务并检查应用程序是否在后台并根据它更改我的设置。

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    if (isGooglePlayServicesAvailable()) {

        if (!isAppIsInBackground(this)) {

            //stopLocationUpdates();

            mLocationRequest.setInterval(FOREGROUND_INTERVAL);
            mLocationRequest.setFastestInterval(FOREGROUND_INTERVAL);
            mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

        } else {
            mLocationRequest.setInterval(BACKGROUND_INTERVAL);
            mLocationRequest.setFastestInterval(BACKGROUND_INTERVAL);
            mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

        }

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

        mGoogleApiClient.connect();
    }

    return super.onStartCommand(intent, flags, startId);
}