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();  
    }  
  
}  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM