Pro Android学习笔记(一一七):Location(3):获取位置更新

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处http://blog.csdn.net/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开发相关文章

你可能感兴趣的:(Pro Android学习笔记(一一七):Location(3):获取位置更新)