1. 程式人生 > >android 保證黑屏之後執行緒可以繼續執行

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定位功能本身自帶就有迴圈定位的功能,所以直接利用此功能即可實現定時上傳了。
程式碼如下所示:

/**
* 獲取gps位置資訊的service
*
* @author king
*
*/
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() {
    // TODO Auto-generated method stub
    // toggleGPS(false);
    if (locationListener != null) {
        locationManager.removeUpdates(locationListener);
    }
    wakeLock.release();
    super.onDestroy();
}

}