在onCreate方法中,我们用了location manager并加入一个自定义类,它实现了LocatioListener接口。可以让我们通过onLocationChanged方法得到位置变换的通知。接下来,看一下怎样去处理更新。我们会使用不同的UI控件给按钮添加onClickListeners。 当用户想要得到目前的坐标时,populateCoordinatesFromLastKnownLocation方法会被调用。在方法内部,使用getLastKnownLocation方法来得到Location对象,位置信息将会被填充到EditText控件。 同样的,当位置信息第一次被获取时,用户想要保存坐标并向saveProxityAlertPoint提供alert(添加POI)。我们可以将经度和纬度以preference data的方式用SharedPreferences类来保存下来,详情请见SharedPreferences.Editor。最后,我们通过getBrodcast静态方法来创建一个PendingIntent。对于这种封装过的intent,我们创建一个intentFilter并使用registerReceiver方法来绑定一个自定义BroadcastReceiver和intentfiler。需要提醒的是,这种绑定还可以通过manifest来实现。 现在,我们来看一下如何来处理用户位置变化。在实现接口的MyLocationListener类里,我们从SharedPreference里获取存储的位置信息(retrievelocationFromPreferences)。然后,通过distranceTo方法计算两个位置(POI和现在位置)的距离。通过这个计算,我们才会知道是否真正进入了某个区域。 第一步,处理进入POI事件。 可以通过继承BroadcastReceiver的类(ProximityIntentReceiver)来实现。当proximity alert被触发,会返回一个自定义intent(之前绑定的locationManager)。处理过程发生在onReceive方法里,它会被事件(进出POI区域)调用。在方法内部,我们从相关intent获取KEY_PROXIMITY_ENTERING key(用来定义proximity alert类型是进入-true,还是离开-false))。 示例代码如下:
代码简洁明了。当我们定义了一个进入或离开的proximity alert,就可以提供一个自定义的推送了。要实现它,首先需要引用一个合适的Service,比如NotificationMananger。通过这个Service,我们发送通知给用户,并封装合适的推送对象。推送的方式是可定制的,如包括震动或者闪光灯等。我们还可以添加特定的图标在状态栏显示。如果只是简单添加标题和信息,适合调用setLastestEventInfo方法。 你可以在这里查看关于notification的详细内容。除此之外,我们可以通过PendingIntent来引导Activity进行下意识地点击推送。 为了让代码更通俗易懂,这里我就不这样做了。 我们最后得到的manifest代码如下:
别忘了,添加相应的Permission到Manifest里: 现在可以测试我们的程序了。启动Eclipse配置,然后跳转到DDMS界面查看Emulation Control标签,可以发现一个Location Controls选项。它可以给模拟器发送模拟的位置数据。在Manual标签里,点击Send按钮,这样就能生成一些坐标。 |