gps数据上传防止android系统休眠

本文介绍了一种在Android设备上实现GPS定时定位的方法,即使在屏幕关闭的情况下也能持续上传定位信息。通过使用Service和WakeLock,确保了在设备休眠时定位服务仍能运行。文章详细解释了如何配置LocationManager进行定时更新,并使用PowerManager.WakeLock防止CPU休眠。
最近在做关于android手机端gps定时定位的功能,需要每隔几秒钟将gps定位获取的经纬度上传至后台,但是发现某些手机在屏幕黑屏,进入休眠状态后,后台就没有收到定位信息了,后来通过网上查找资料,发现一旦手机在休眠的时候,手机的cpu也休眠了,创建的线程也会sleep,所以为了让手机屏幕黑屏之后,上传线程可以继续运行,就必须保存手机CPU一直处于运行状态,综合网上所查找的资料,发现可以通过使用android的 PowerManager和PowerManager.WakeLock这两个类来控制,具体关于这两个类的使用可以参考: http://www.cnblogs.com/keyindex/articles/1819504.html
下面来说一下我的GPS定时定位主要思想:
1、要实现程序退出之后,仍然可以定时上传定位信息,必须采用service,service可以保持在后台一直运行,除非系统资源极其匮乏,否则一般来说service是不会被系统杀死的。
2、要实现定时上传,因为android系统自带的gps定位功能本身自带就有循环定位的功能,所以直接利用此功能即可实现定时上传了。
代码如下所示:
public class MyService extends Service {  
  
    private LocationManager locationManager;  
  
    private PowerManager pm;  
    private PowerManager.WakeLock wakeLock;  
  
    private GPSUploadThread myThread;  
  
    @Override  
    public IBinder onBind(Intent intent) {  
        // TODO Auto-generated method stub  
        return null;  
    }  
  
    @Override  
    public void onCreate() {  
        super.onCreate();  
  
        //创建LocationManger对象(LocationMangager,位置管理器。要想操作定位相关设备,必须先定义个LocationManager)  
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  
        //利用Criteria选择最优的位置服务  
        Criteria criteria = new Criteria();  
        //设置定位精确度 Criteria.ACCURACY_COARSE比较粗略,Criteria.ACCURACY_FINE则比较精细   
        criteria.setAccuracy(Criteria.ACCURACY_FINE);  
        //设置是否需要海拔信息  
        criteria.setAltitudeRequired(false);  
        //设置是否需要方位信息  
        criteria.setBearingRequired(false);  
        // 设置是否允许运营商收费    
        criteria.setCostAllowed(true);  
        // 设置对电源的需求    
        criteria.setPowerRequirement(Criteria.POWER_LOW);  
        //获取最符合要求的provider  
        String provider = locationManager.getBestProvider(criteria, true);  
        //绑定监听,有4个参数      
        //参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种  
        //参数2,位置信息更新周期,单位毫秒      
        //参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息      
        //参数4,监听      
        //备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新   
        locationManager.requestLocationUpdates(provider, 10000, 0,locationListener);// 2000,10  
    }  
  
    @Override  
    public void onStart(Intent intent, int startId) {  
        // TODO Auto-generated method stub  
        super.onStart(intent, startId);  
        //创建PowerManager对象  
        pm = (PowerManager) getSystemService(Context.POWER_SERVICE);  
        //保持cpu一直运行,不管屏幕是否黑屏  
        wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "CPUKeepRunning");  
        wakeLock.acquire();  
    }  
  
      
    private final LocationListener locationListener = new LocationListener() {  
          
        @Override  
        public void onLocationChanged(Location location) {  
            // TODO Auto-generated method stub  
              
              
        }  
  
        // 当位置信息不可获取时  
        @Override  
        public void onProviderDisabled(String provider) {  
            // TODO Auto-generated method stub  
              
        }  
  
        @Override  
        public void onProviderEnabled(String provider) {  
            // TODO Auto-generated method stub  
  
        }  
  
        @Override  
        public void onStatusChanged(String provider, int status, Bundle extras) {  
            // TODO Auto-generated method stub  
  
        }  
  
    };  
  
    @Override  
    public void onDestroy() {  
        if (locationListener != null) {  
            locationManager.removeUpdates(locationListener);  
        }  
        wakeLock.release();  
        super.onDestroy();  
    }  
  
}  

 

转载于:https://www.cnblogs.com/changyiqiang/p/10033031.html

Android锁屏无法继续定位问题 产生问题的原因: 手机锁屏后,Android系统为了省电以及减少CPU消耗,在一段时间后会将手机进入休眠状态。此时的服务以及线程等都会停止。 最近就这个问题,阅读了很多代码以及官方文档,下面就说下最近都尝试过的方式,可能其中有些您实现了,我这边没实现,望见谅。本文采用的高德定位。 一、PowerManager.WakeLock (1)直接强制当前页面cpu运行 private PowerManager pm; private PowerManager.WakeLock wakeLock; @Override public void onCreate() { super.onCreate(); //创建PowerManager对象 pm = (PowerManager) getSystemService(Context.POWER_SERVICE); //保持cpu一直运行,不管屏幕是否黑屏 wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "CPUKeepRunning"); wakeLock.acquire(); } @Override public void onDestroy() { wakeLock.release(); super.onDestroy(); } 这个写法我表示并没有什么用,并不能强制cpu持续运行。 (2)WakefulBroadcastReceiver public class WLWakefulReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // String extra = intent.getStringExtra("msg"); Intent serviceIntent = new Intent(context, MyIntentService.class); serviceIntent.putExtra("msg", extra); startWakefulService(context, serviceIntent); } } WakefulBroadcastReceiver 内部的原理也是PowerManager,注册广播时8.0的请动态注册,静态没有用。广播注册完了之后,写一个服务用来与广播互动。 public class MyIntentService extends IntentService { public MyIntentService() { super("MyIntentService"); } @Override public void onCreate() { super.onCreate(); } @Override protected void onHandleIntent(@Nullable final Intent intent) { //子线程中执行 Log.i("MyIntentService", "onHandleIntent"); String extra = intent.getStringExtra("msg"); new Thread(new Runnable() { @Override public void run() { LocationUtil.getInstance().startLocation(LocationUtil.NULL, new LocationUtil.OnLocationBack() { @Override public void back(AMapLocation aMapLocation, String backString) { Log.e("定位結果", aMapLocation.getAddress()+""); 定位结果操作,我这边是把定位的时候保存到数据库里面。 } }); } }).start(); Log.i("MyIntentService", "onHandleIntent:"+extra); //调用completeWakefulIntent来释放唤醒锁。 // WLWakefulReceiver.completeWakefulIntent(intent); } } 注册
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值