Android 智能位置库在应用程序关闭后始终连接到 gps

Android Smart Location Library is always connected to gps after application closed

我正在开发一个在开始时获取用户位置的应用程序。我正在使用 Smart Location Library 获取位置和反向地理编码。但主要问题是 GPS 已连接,即使在应用程序关闭后也会显示在通知中。我检查了堆栈跟踪但没有发现任何泄漏的 window 异常。 我正在使用此代码获取我的位置..

private void getMyLocation(){
    final long mLocTrackingInterval = 1000000 * 5; // 5 sec
    float trackingDistance = 1000 * 10;
    LocationAccuracy trackingAccuracy = LocationAccuracy.HIGH;
    LocationParams.Builder builder = new LocationParams.Builder()
                .setAccuracy(trackingAccuracy)
                .setDistance(trackingDistance)
                .setInterval(mLocTrackingInterval);
    SmartLocation.with(mContext)
                .location(provider)
                // .continuous()
                .oneFix()
                .config(builder.build())
                .start(this);
}

@Override
public void onLocationUpdated(Location location) {
    SmartLocation.with(mContext).geocoding()
            .reverse(location,new OnReverseGeocodingListener() {
                @Override
                public void onAddressResolved(Location location, List<Address> results) {
                    if (results.size() > 0) {
                        mAddressList=results;
                        mLocation=location;
                        tvLocation.setText( results.get(0).getAddressLine(0)+"\n"+results.get(0).getAddressLine(1));
                    }
                }
            });
}

onStop()主要活动的方法..

@Override
protected void onStop() {
    super.onStop();
    SmartLocation.with(mContext).location(provider).stop();
    SmartLocation.with(mContext).geocoding().stop();
}

编辑

我正在使用这个提供者。我也尝试过其他供应商。但是还是一样的结果。

private LocationGooglePlayServicesWithFallbackProvider provider=new LocationGooglePlayServicesWithFallbackProvider(mContext);

我已经尝试了很多,但无法弄清楚实际问题是什么。任何帮助,将不胜感激。谢谢

为了让应用程序保持响应,很多事情都是异步完成的。这是一件好事。看起来您使用的库就是这样工作的。参见Sample of MainActivity.javaonActivityResult()就是你要找的人。

那么,它什么时候返回数据?我们只是不确定...

那怎么阻止呢?好吧,那是 Android 的另一部分。请看这个 Android Activity Lifecycle。您会注意到,虽然 onStop() 通常被 调用,但它并不是用户执行其他操作时的第一件事。如果你等待 onStop() 被调用,你不知道那是什么时候。 如果用户离开应用程序并手动将其从内存中删除,则肯定只会调用 onPause() ,根据我的经验,其余部分有点碰运气。

因此,如果您想在用户离开时关闭 GPS(但您的应用程序仍在内存中,准备好接收通知),您可以在 onPause() 中执行此操作。像这样:

@Override
protected void onPause() {
    super.onPause();

    if (SmartLocation == still_running) { // pseudo code
        SmartLocation.with(mContext).location(provider).stop();
        SmartLocation.with(mContext).geocoding().stop();
    }
}