最近在做關於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(); } }