1. 程式人生 > >gps資料上傳防止android系統休眠

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