zoukankan      html  css  js  c++  java
  • gps数据上传防止android系统休眠

    最近在做关于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();  
        }  
      
    }  
  • 相关阅读:
    树莓派笔记——了解与购买树莓派(1)
    SQLserver 备份和还原 失败
    lua coroutine
    lua for循环
    leetcode 46. 全排列
    sprintf、vsprintf、sprintf_s、vsprintf_s、_snprintf、_vsnprintf、snprintf、vsnprintf 函数辨析
    rapidxml的常见读写操作
    C++11 可变参数模板构造string列表
    Fedora 28 设置yum代理
    Linux命令计算文件中某一列的平均值
  • 原文地址:https://www.cnblogs.com/changyiqiang/p/10033031.html
Copyright © 2011-2022 走看看