让Service在手机休眠后仍然运行
现在正在做的项目一个需求是时刻记录用户GPS位置(在服务器端接收位置,并在地图上绘出运动轨迹),我们的做法是启一个用于监听GPS位置变化的Service,每隔10分钟获取一次位置,如果位移范围在100m以上,向服务器发送一次数据。开发完成后发现一个问题,当手机进入休眠状态时,这个监听GPS的Service似乎就不工作了。经过不断Google和尝试发现,在Android中,申请WakeLock可以让进程持续执行即使手机进入睡眠模式,以下是我的解决方案:
在Service的onCreate()方法中加入以下代码,申请WakeLock:
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, GpsService.class.getName()); wakeLock.acquire();
申请了WakeLock要记得释放,否则手机可能无法进入休眠状态。在onDestroy()方法中加入:
if (wakeLock != null) { wakeLock.release(); wakeLock = null; }
至此,我的问题解决了,不知道能不能解决你的问题?
| anyShare分享到: | |
| |
发表在《
发表在《
发表在《
希望与你讨论一下这方面的研究。在定位定不到的时候是否用基站来拟补呢?监听Service 是监听Last位置么?
[回复]
iStar
回复:
八月 24th, 2011 at 上午 10:42
可以用基站来弥补的,可以试试这样:
LocationManager locMan = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
Location location = locMan.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if(location==null){
location = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
**************************************************************************************
监听Service是定时调用LocationManager.requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)方法。
[回复]
估计你这样申请了,你手机电池可能会变成热鸡蛋吧,可能你会成为一个更好的男人了(每天要回家充两次电)
[回复]
喂喂!是10分钟的间距哎,很长了哎。为什么不用Alarm每10分钟从休眠中唤醒一次呢?效果是一样的啊!
如果可能的话用Alarm吧,我可不想某一天用了你们的软件导致我一天一充电….
[回复]
iStar
回复:
四月 15th, 2012 at 下午 12:04
这是以前的实现,已经改进了。另外我们这个软件是给保险公司定制的,属于行业软件,普通用户不用的,呵呵!
[回复]