停止LocationManager更新

时间:2011-12-13 06:57:31

标签: android

我正在尝试将GPS坐标发送到短信。此代码有效,但每次GPS更新位置时,它都会尝试发送新的短信。我无法弄清楚如何停止位置更新。这就是我目前所拥有的......我意识到这可能不是最有效的方法。

任何帮助将不胜感激!

  public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    LocationListener mlocListener = new MyLocationListener();
    mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);

}

public void GPSDisable() {
    LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    LocationListener mlocListener = new MyLocationListener();
    mlocManager.removeUpdates(mlocListener);
}

public class MyLocationListener implements LocationListener {

    @Override

    public void onLocationChanged(Location loc) {

        loc.getLatitude();
        loc.getLongitude();

        double latitude = loc.getLatitude();
        double longitude = loc.getLongitude();

        Intent smsIntent = new Intent(Intent.ACTION_VIEW);
        smsIntent.setType("vnd.android-dir/mms-sms");
        smsIntent.putExtra("address", "5555555555");
        smsIntent.putExtra("sms_body", "Location:"+latitude+","+longitude);
        GPSDisable();
        startActivity(smsIntent);

    }


    @Override

    public void onStatusChanged(String provider, int status, Bundle extras)

    {

    }


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

    }

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

    }

}

@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub

}

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

}

@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 :(得分:0)

首先,我建议你看一下this article

话虽如此,一般来说,当您不再需要更新时,您应该“取消订阅”位置管理员。通常,只要您的活动处于“活动状态”,您就需要在“onCreate”中订阅位置更新,并在“onDestroy”中取消订阅。 更好的是在您的活动分别可见或隐藏时订阅/取消订阅(分别通过“onResume”/“onPause”)。有关活动生命周期的详细信息,请查看here

现在,关于您的具体问题,目前尚不清楚您的行为是什么。是否要在每次位置更改时发送短信?或者只是在一段时间过去了?

假设您需要的是在您的位置发生变化时发送短信但不经常发送,我建议如下: 1.在“onResume”中注册位置更新,并在“onPause”中取消注册。 2.维护一些局部变量,告诉您上次发送SMS消息的时间以及其中的坐标是什么。这些变量可能应该持久存在Activity生命周期事件(例如,当Activity被销毁时,你应该“存储”这些值,并在重新创建时恢复它们)。 3.每当有新的位置更新时,检查它是否太快或太近(与之前的SMS相比),如果没有发送另一条消息,则更新变量。

说完这些之后,请注意只要您的活动可见,这将有效。如果您需要类似的功能,不需要您保持活动可见,我建议您使用BroadcastReceiver。

答案 1 :(得分:0)

我会设置两个全局变量纬度和经度。 每个onLocationChanged都会更新此变量。你无法改变这种竞争,但你可以从那里发送短信。

我会在5秒钟之后将短信发送到计时器上。比如说。

new java.util.Timer().schedule( 
    new java.util.TimerTask() {
        @Override
        public void run() {
           Intent smsIntent = new Intent(Intent.ACTION_VIEW);
    smsIntent.setType("vnd.android-dir/mms-sms");
    smsIntent.putExtra("address", "5555555555");
    smsIntent.putExtra("sms_body", "Location:"+latitude+","+longitude);

    startActivity(smsIntent);
        }
    }, 
    5000 );

你的位置改变可能看起来像这样

 @Override
public void onLocationChanged(Location loc) {
    loc.getLatitude();
    loc.getLongitude();

    latitude = loc.getLatitude();
    longitude = loc.getLongitude();


}