关闭后GPS不会更新位置,并在Android上重新打开应用程序

时间:2009-09-07 15:07:00

标签: android gps

关闭我的应用程序一段时间后再重新打开它,我的应用程序将不会更新位置或 有时需要很长时间(约5分钟)才能更新。 我该如何解决?这是我的代码

  private LocationManager lm;
private LocationListener locationListener;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);    

    lm = (LocationManager) 
        getSystemService(Context.LOCATION_SERVICE);    

    locationListener = new mLocationListener();

    lm.requestLocationUpdates(
        LocationManager.GPS_PROVIDER, 0, 0, locationListener); }


private class myLocationListener implements LocationListener 
{
    @Override
    public void onLocationChanged(Location loc) {
        if (loc != null) {
            TextView gpsloc = (TextView) findViewById(R.id.widget28);
            gpsloc.setText("Lat:"+loc.getLatitude()+" Lng:"+ loc.getLongitude());
        }
    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub
        TextView gpsloc = (TextView) findViewById(R.id.widget28);
        gpsloc.setText("GPS OFFLINE.");
    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onStatusChanged(String provider, int status, 
        Bundle extras) {
        // TODO Auto-generated method stub
    }
}

2 个答案:

答案 0 :(得分:7)

一些事情......

可能发生的事情是你的应用程序正在恢复而不是创建“第二”时间。如果您希望每次查看活动时都要查找新位置,您需要将以下代码移到onResume()方法中:

lm.requestLocationUpdates(
    LocationManager.GPS_PROVIDER, 0, 0, locationListener); }

您还需要确保在onPause()方法中取消注册LocationListener。这样的事情应该这样做:

@Override
public void onPause() {
    lm.removeUpdates(locationListener);
    super.onPause();
}

看起来你在这一行上有一个错字:

locationListener = new mLocationListener();

我认为应该是:

locationListener = new myLocationListener();

另外,正如其他人提到的那样,没有理由创建一个全新的类来充当您的LocationListener。实际上,它会不必要地耗尽内存,而且在移动设备上内存非常宝贵。

上述所有内容的组合会使您的活动看起来像这样:

public class Whatever extends Activity implements LocationListener {
    private LocationManager lm;
    private LocationListener locationListener;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);    

        lm = (LocationManager)  getSystemService(Context.LOCATION_SERVICE);    
        locationListener = new mLocationListener();
    }

    @Override 
    public void onResume() {
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 1, this);
        super.onResume();
    }

    @Override
    public void onPause() {
        lm.removeUpdates(this);
        super.onPause();
    }

    @Override
    public void onLocationChanged(Location loc) {
        if (loc != null) {
            TextView gpsloc = (TextView) findViewById(R.id.widget28);
            gpsloc.setText("Lat:"+loc.getLatitude()+" Lng:"+ loc.getLongitude());
        }
    }

    @Override
    public void onProviderDisabled(String provider) {
        TextView gpsloc = (TextView) findViewById(R.id.widget28);
        gpsloc.setText("GPS OFFLINE.");
    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub
    }
}

答案 1 :(得分:0)

为什么你使用了0分钟和0精度,它会很快耗尽你的电池......如果不是必要的话,请不要这样做 其次 你在这里提到的时间延迟肯定是gps芯片访问gps数据所需的时间,这可能会因GPS信号的可用性而有所不同
关于更新你应该尝试这个

public void onLocationChanged(Location loc) {
        if (loc != null) {
            TextView gpsloc = (TextView) findViewById(R.id.widget28);
            gpsloc.setText("Lat:"+loc.getLatitude()+" Lng:"+ loc.getLongitude());
        }
        else
             {gpsloc.setText("provider not available");}//provider available or not 

    }

可能没有提供者可用于更新位置