文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处http://blog.youkuaiyun.com/flowingflying以及作者@恺风Wei。
在很多LBS应用中,需要不断地监听位置信息,LocationManager的一个重要功能就是接受设备的位置通知。
监听位置信息
简单的代码片段如下:
public class LocationUpdateDemo extends Activity{
private TextView tv = null;
private LocationManager manager = null;
private LocationListener listener = null;
private String provider = null;
private Location lastLoc = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_pure);
tv = (TextView) findViewById(R.id.text);
manager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
provider = manager.getBestProvider(new Criteria(), true);
if(provider == null)
provider = LocationManager.GPS_PROVIDER;
//【步骤1】设置接收器
listener = new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
/*即使某个供应商是enable,也不表示可以从他处监听位置信息,例如GPS是enable的,但是搜索不到卫星,状态包括有:OUT_OF_SERVICE,TEMPORARILY_UNAVAILABLE和AVAILABLE*/
}
@Override
public void onProviderEnabled(String provider) {
/* 当用户在系统设置中,开启某个位置供应商*/
}
@Override
public void onProviderDisabled(String provider) {
/*当用户在系统设置中,关闭某个供应商。如果某个供应商是disabled,当通过requestLocationUpdate()向系统注册监听位置,马上就会触发onProviderDisabled()。*/
}
@Override
public void onLocationChanged(Location location) { /* 监听到位置信息 */
if(location != null){
showInfo("New Location (" + location.getLongitude()+", " + location.getLatitude() + ")");
if(lastLoc != null){
showInfo("Move " + location.distanceTo(lastLoc) + " meters"); //计算两个location之间的距离
}
lastLoc = location;
}
}
};
}
@Override
protected void onResume() {
super.onResume();
/*【步骤2】注册位置通知的接收器。我们考虑到横竖屏切换等导致Activity重启,或者出现覆盖等情况,需要在合适的位置进行注册和取消注册。本例,我们不需要Activity不在top的时候处理位置更新信息。
*我们设置了最小的变化值为100米,如果为0,则尽可能地不断获取位置信息。
*对于模拟器,在DDMS中send一次位置形象,就会触发发送一次位置通知,对于模拟器,第2参数和第3参数设置为0,方便调测,但是在实际中会消耗电源,尽量要避免。 */
manager.requestLocationUpdates(provider, 0 /*毫秒,间隔时间*/, 100 /*米*/, listener);
}
@Override
protected void onPause() {
super.onPause();
//【步骤3】取消注册位置更新接收器
manager.removeUpdates(listener);
}
private void showInfo(String info){
Log.i("WEI",info);
tv.setText(tv.getText() + "\n" + info);
}
}
其他方式
manager.requestLocationUpdates()中还可以带有个PendingIntent,可以将位置给service或者broadcast receiver。另外可以携带的参数还有Looper线程。这些都可以根据具体需求灵活运用。
小例子代码在:Pro Android学习:location小例子
相关链接:我的Android开发相关文章