首页 > Android > 让Service在手机休眠后仍然运行

让Service在手机休眠后仍然运行

2011年7月27日 发表评论 阅读评论

现在正在做的项目一个需求是时刻记录用户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分享到:
          
分类: Android 标签: , ,
  1. surpassyx
    2011年8月24日09:44 | #1

    希望与你讨论一下这方面的研究。在定位定不到的时候是否用基站来拟补呢?监听Service 是监听Last位置么?

    [回复]

    iStar CHINA Google Chrome Windows 回复:

    可以用基站来弥补的,可以试试这样:
    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)方法。

    [回复]

  2. 路过
    2011年11月8日11:04 | #2

    估计你这样申请了,你手机电池可能会变成热鸡蛋吧,可能你会成为一个更好的男人了(每天要回家充两次电)

    [回复]

  3. 路人
    2012年4月15日12:01 | #3

    喂喂!是10分钟的间距哎,很长了哎。为什么不用Alarm每10分钟从休眠中唤醒一次呢?效果是一样的啊!

    如果可能的话用Alarm吧,我可不想某一天用了你们的软件导致我一天一充电….

    [回复]

    iStar CHINA Google Chrome Linux 回复:

    这是以前的实现,已经改进了。另外我们这个软件是给保险公司定制的,属于行业软件,普通用户不用的,呵呵!

    [回复]

  1. 本文目前尚无任何 trackbacks 和 pingbacks.