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

时间:2015-05-26 06:55:43

标签: android service android-location location-services android-fusedlocation

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

我的实施如下:

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。更新间隔也一样。如果运行应用程序的应用程序应经常更新位置,并且它在后台时应该在一段时间后更新。

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

我完全得到应用程序在前台或后台。唯一的问题是切换优先级。

3 个答案:

答案 0 :(得分:0)

您可以通过意图与您的服务进行交互来实现这一目标。并以所需的准确度取消注册/注册位置请求。

答案 1 :(得分:0)

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

  

onPause()是您处理离开活动的用户的地方。最重要的是,此时应该提交用户所做的任何更改

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

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

在服务中 - 您可以在onStartCommand()中获取意图附加内容的值。

答案 2 :(得分:0)

我通过创建新的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);
}