转自 http://www.cnblogs.com/wangfenjin/archive/2013/01/09/2853307.html
Android通过百度地图API用Service和Alarm在后台定时获取地理位置信息
本文主要介绍了Android项目集成百度地图API,使用AlarmManager定时调用Service,在Service中请求坐标更新,并通过坐标得到省、市和县三级地理位置信息的方法。
程序结构很简单,先做简单介绍,后面详细说明:
- MainActivity.java是创建项目自带的,不用管;
- BMapApiDemoApp.java是大部分是百度自带demo文件没有改动,只是在里面添加了Alarm相关的代码;
- GetLocationService.java是Alarm启动的Service类,在这个类中请求位置更新;
- GeoCoderParser.java是用于接收地理位置信息的回调类。
百度地图API
集成百度地图API的方式很简单,可以上官网http://developer.baidu.com/map/sdk-android.htm下载相应的库文件和demo。具体的集成方法这里不再赘述,仅仅讨论一下BMapApiDemoApp这个类。代码如下:
1 public class BMapApiDemoApp extends Application { 2 3 private static final String TAG = "BMapApiDemoApp"; 4 5 static BMapApiDemoApp mDemoApp; 6 7 BMapManager mBMapMan = null; 8 9 String mStrKey = "Your key here!!"; 10 boolean m_bKeyRight = true; 11 12 static class MyGeneralListener implements MKGeneralListener { 13 @Override 14 public void onGetNetworkState(int iError) { 15 Log.d("MyGeneralListener", "onGetNetworkState error is " + iError); 16 Toast.makeText(BMapApiDemoApp.mDemoApp.getApplicationContext(), 17 "Network error", Toast.LENGTH_LONG).show(); 18 } 19 20 @Override 21 public void onGetPermissionState(int iError) { 22 Log.d("MyGeneralListener", "onGetPermissionState error is " 23 + iError); 24 if (iError == MKEvent.ERROR_PERMISSION_DENIED) { 25 Toast.makeText(BMapApiDemoApp.mDemoApp.getApplicationContext(), 26 "Permission deny! Add key in BMapApiDemoApp.java!", Toast.LENGTH_LONG).show(); 27 BMapApiDemoApp.mDemoApp.m_bKeyRight = false; 28 } 29 } 30 } 31 32 @Override 33 public void onCreate() { 34 mDemoApp = this; 35 mBMapMan = new BMapManager(this); 36 boolean isSuccess = mBMapMan 37 .init(this.mStrKey, new MyGeneralListener()); 38 if (isSuccess) { 39 mBMapMan.getLocationManager().setNotifyInternal(10, 5); 40 startAlarm(); 41 } else { 42 } 43 super.onCreate(); 44 } 45 46 private void startAlarm() { 47 Log.d(TAG, "start alarm"); 48 AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 49 Intent collectIntent = new Intent(this, GetLocationService.class); 50 PendingIntent collectSender 51 = PendingIntent.getService(this, 0, collectIntent, 0); 52 am.cancel(collectSender); 53 am.setRepeating(AlarmManager.ELAPSED_REALTIME 54 , SystemClock.elapsedRealtime() 55 , 10 * 1000 56 , collectSender); 57 } 58 59 @Override 60 public void onTerminate() { 61 // TODO Auto-generated method stub 62 if (mBMapMan != null) { 63 mBMapMan.destroy(); 64 mBMapMan = null; 65 } 66 super.onTerminate(); 67 } 68 69 }
主要关注如下几点:
- BMapApiDemoApp覆盖了Application类,并在onCreate()函数中初始化BMapManager对象,这样程序就可以共享这个对象。
- BMapManager类主要有4个函数,init(), start(), stop() 和destory()。一般在Application类的onCreate()函数中调用init,在onDestory()函数中调用destory,这样在需要使用其他API的地方只需要取到这个对象并调用start和stop方法就可以了。但是为了保证BMapManager对象存在,在其他调用的类中还是会做相应的检查。
- 文件中变量mStrKey保存的是需要去官网申请的API的key,申请很容易。
- 我在onCreate()函数中还调用了startAlarm()函数。这个函数的作用是每隔10s调用GetLocationService类。
GetLocationService
GetLocationService主要覆写了两个函数onStartCommand()和onCreate(),代码如下:
1 public class GetLocationService extends Service { 2 3 protected static final String TAG = null; 4 LocationListener mLocationListener = null; 5 BMapApiDemoApp app = null; 6 @Override 7 public void onCreate() { 8 super.onCreate(); 9 app = (BMapApiDemoApp) this.getApplication(); 10 if (app.mBMapMan == null) { 11 app.mBMapMan = new BMapManager(getApplication()); 12 app.mBMapMan.init(app.mStrKey, 13 new BMapApiDemoApp.MyGeneralListener()); 14 } 15 app.mBMapMan.start(); 16 final MKSearch mMKSearch = new MKSearch(); 17 mMKSearch.init(app.mBMapMan, new GeoCoderParser()); 18 19 // 注册定位事件 20 mLocationListener = new LocationListener() { 21 22 @Override 23 public void onLocationChanged(Location location) { 24 Log.d(TAG, "location change"); 25 if (location != null) { 26 String strLog = String.format("经度:%f\r\n" + "纬度:%f", 27 location.getLongitude(), 28 location.getLatitude()); 29 Log.d(TAG, strLog); 30 GeoPoint point = new GeoPoint((int)(location.getLatitude() * 1E6), (int)(location.getLongitude() * 1E6)); 31 mMKSearch.reverseGeocode(point); 32 33 app.mBMapMan.getLocationManager().removeUpdates(mLocationListener); 34 app.mBMapMan.stop(); 35 } 36 } 37 }; 38 } 39 40 @Override 41 public int onStartCommand(Intent intent, int flag, int startId) { 42 app.mBMapMan.getLocationManager().requestLocationUpdates( 43 mLocationListener); 44 app.mBMapMan.start(); 45 return Service.START_NOT_STICKY; 46 } 47 48 @Override 49 public IBinder onBind(Intent intent) { 50 // TODO Auto-generated method stub 51 return null; 52 } 53 54 }
其中:
- 在onCreate()中取到在BMapApiDemoApp里定义的BMapManager对象,并检查是否存在,不存在就初始化一个;
- 在onStartCommand()中注册LocationListener并调用BMapManager的start函数;
- LocationListener是在onCreate()中定义的,mMKSearch.reverseGeocode()传入GeoPoint对象,搜索之后的返回值通过GeoCoderParser类取到;当得到Location信息之后我调用了removeUpdates和stop函数停止请求更新。
1 GeoPoint point = new GeoPoint((int)(location.getLatitude() * 1E6), (int)(location.getLongitude() * 1E6)); 2 mMKSearch.reverseGeocode(point); 3 4 app.mBMapMan.getLocationManager().removeUpdates(mLocationListener); 5 app.mBMapMan.stop();
代码最后执行的时候有一个小bug就是removeUpdate()貌似被执行了两次,没有详细追究,不知道是什么原因。不过也无伤大雅。
GeoCoderParser
最后就是用于接收MKSearch.reverseGeocode()结果的类。
这个类的实现了MKSearchListener接口,接口的函数比较多,但是我们这里只关注onGetAddrResult(MKAddrInfo arg0, int arg1)函数。这个函数有两个参数:
- arg1是错误码,搜索失败的时候通过错误码得到失败原因;
- arg0是传入的地址信息,它是一个MKAddrInfo对象,对象有个字段是addressComponents,这个字段保存了从省、市一直到门牌号的信息。
1 public class GeoCoderParser implements MKSearchListener { 2 3 private static final String TAG = "GeoCoderParser"; 4 5 @Override 6 public void onGetAddrResult(MKAddrInfo arg0, int arg1) { 7 if (arg1 != 0) { 8 String str = String.format("%d", arg1); 9 Log.d(TAG, str); 10 return; 11 } 12 MKGeocoderAddressComponent address = arg0.addressComponents; 13 Log.d(TAG, "Location info:" + address.province + address.city + address.district); 14 } 15 16 //other functions 17 18 }
总结
程序的流程大致就是这样,我也是初学,如果哪里写错了欢迎批评指正。
最后给出项目代码的链接:http://files.cnblogs.com/wangfenjin/BaiduMapService.zip 。我没找到博客园哪里可以传附件,所以是通过“文件”那个标签上传的,不知道你们可不可以下载。
项目代码没什么特殊的地方,主要注意一下Manifest文件里面请求相应的权限和注册Service就行了。
相关推荐
在Android系统中,实现一个能够长期在后台运行的定时任务是一项关键的技术挑战,因为Android系统为了优化电池寿命和用户体验,可能会在应用不活跃时限制其后台活动。标题"Alarm.7z,Android定时任务"表明这是一个与...
android上面alarm功能设置定时功能时,并不能把alarm写入到rtc芯片的alarm寄存器中,所以要...代码中在4.4和5.1上已调试通过,通过增加jni接口直接对rtc ioctrl写入alarm操作,在shutdown把开机时间写入到rtc寄存器中
在Android开发中,定时任务是应用中不可或缺的一部分,它允许开发者在特定的时间点或周期性地执行某些操作,比如更新应用数据、发送通知或者执行后台服务。本篇将深入探讨如何利用Android的Alarm机制轻松创建定时...
在Android系统中,Alarm(闹钟)和Alert(提醒)是两个重要的概念,它们与系统的通知和定时事件处理紧密相关。本文将详细讲解Android Alarm和Alert的机制、使用方法以及如何在实际应用中实现相关功能。 一、Android...
3. **获取AlarmManager实例**: 在你的活动或服务中,通过`getSystemService()`方法和`ALARM_SERVICE`常量获取`AlarmManager`的实例。 4. **设置闹钟**: 使用`AlarmManager`的`set()`或`setRepeating()`方法设置闹钟...
通过`Context.getSystemService(Context.ALARM_SERVICE)`可以获取到`AlarmManager`实例。 2. **Alarm类型** - **RTC**: 使用此模式时,闹钟在系统的实时时钟(RTC)达到设定时间时触发,即使设备处于休眠状态也会...
笔者最近将工具书上Service的有关内容都学习了一下,于是打算做一个小应用来练一下手了。 考虑到自己每次在敲代码或者打游戏的时候总是会不注意时间,一不留神就对着电脑连续3个小时以上,对眼睛的伤害还是挺大的,...
在Android系统中,闹钟服务(AlarmClock)是系统级的重要功能之一,它允许开发者设置定时事件,并在指定时间触发提醒。本资源提供的是Android 2.1版本(API级别7)内置闹钟应用的源代码,对于学习和理解Android系统...
在Android开发中,后台服务和定时任务是两个重要的概念,特别是在构建需要持续运行或定期执行功能的应用时。本文将深入探讨如何使用`AlarmManager`和`Service`来实现后台的定时任务。 首先,`Service`是Android系统...
在Android操作系统中,`AlarmClock`是系统提供的一项重要功能,它允许开发者创建应用程序来管理和设置闹钟。在本文中,我们将深入探讨`AlarmClock`的工作原理,以及如何在实际应用中实现一个经过真机实测的功能完善...
在Android系统中,服务(Service)和广播接收者(BroadcastReceiver)是两个核心组件,它们在后台执行任务和实现跨应用程序通信。本教程将深入探讨如何利用这两种组件来实现手机背景的定时切换功能,比如根据用户...
在Android应用开发中,Service是四大组件之一,用于在后台执行长时间运行的操作,不与用户交互。本篇文章将深入探讨Service的手动重启、自动重启以及在特殊条件下的重启策略,帮助开发者更好地理解和管理Service的...
通过学习和实践这个"Android_Alarm-master"项目,初学者可以掌握Android中定时任务的实现,为开发更复杂的后台功能打下基础。同时,理解Alarm Manager的工作原理也有助于优化应用的电池使用和性能。
- **GPS定位**:GPS是全球定位系统,Android中的Location API允许应用获取设备的位置信息,通常会开启GPS卫星接收器,这是一项高能耗操作。 - **位置服务的耗电**:持续开启GPS会显著消耗电量,尤其是在没有移动...
总结起来,Alarm唤醒方法是Android开发中的重要技能,理解其工作原理和使用方式,可以帮助开发者创建出高效、可靠的定时任务。通过合理设置AlarmManager、PendingIntent以及考虑电源管理策略,我们可以实现从休眠...
在Android程序设计中,"ALARM"通常指的是系统的AlarmManager服务,它允许应用程序安排在未来某个时间点触发一个事件。这个事件可以是启动一个服务、发送一个广播或者执行其他操作。在开发闹钟应用时,这一功能尤为...
位置服务在Android编程中扮演着重要的角色,它允许开发者创建应用程序来获取用户的实时地理位置信息,进行导航、跟踪、社交互动等各种功能。本章主要讲解了如何在Android平台上进行位置服务编程,包括基本概念、API...
在Android开发中,"Alarm"通常指的是系统的AlarmManager服务,它是Android系统提供的一种调度机制,允许开发者安排在未来的某个时间点执行特定任务。这个小项目可能是开发者为了学习和实践Android编程,尤其是...
在Android操作系统中,AlarmClock是一个至关重要的组件,它允许开发者创建和管理应用程序的定时提醒功能。本文将深入探讨Android AlarmClock的源码,理解其工作原理,并指导如何在实际项目中安全、高效地运用。 一...