那麼經過一番研究和冥想:)我已經想出了這樣的一個東西:一個服務,可以在兩種模式下運行(取決於listenPeriod變量):1)簡單地處理座標一次,然後關閉自我listenPeriod = 0); 2)並以指定的速率處理座標(listenPeriod> 0),直到服務關閉。
GPSTracer.listenPeriod = 120000;
comp = new ComponentName(context.getPackageName(), GPSTracer.class.getName());
GPSTracer.iGPSTracer = new Intent(context, GPSTracer.class.getClass());
GPSTracer.iGPSTracer.setComponent(comp);
service=context.startService(GPSTracer.iGPSTracer);
所以我必須在啓動我的服務之前初始化listenPeriod變量。而服務部分看起來是這樣的:
public class GPSTracer extends Service {
public static Intent iGPSTracer;
public static volatile Location mLocation = null;
public static volatile LocationListener mLocationListener = null;
public static LocationManager mLocationManager = null;
public static long listenPeriod = 0;
Timer mTimer = null;
Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.arg1 == 1)
{
if(GPSTracer.mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
{
GPSTracer.mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 120000, 100, GPSTracer.mLocationListener);
}
else if(GPSTracer.mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
{
GPSTracer.mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 120000, 100, GPSTracer.mLocationListener);
}
else
{
List<NameValuePair> gpsData = new ArrayList<NameValuePair>();
gpsData.add(new BasicNameValuePair("Error", "No location provider"));
stopSelf();
}
}
else if(msg.arg1 == 0)
{
GPSTracer.mLocationManager.removeUpdates(GPSTracer.mLocationListener);
}
};
};
TimerTask selfStopTask = new TimerTask() {
@Override
public void run() {
stopSelf();
}
};
TimerTask mTimerTask = new TimerTask() {
@Override
public void run() {
//Message mMessage = new Message();
//mHandler.sendMessage(mMessage);
if(mLocation == null)
{
mLocation = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if(mLocation == null)
{
mLocation = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
}
if(mLocation != null)
{
List<NameValuePair> gpsData = new ArrayList<NameValuePair>();
gpsData.add(new BasicNameValuePair("Latitude", (new Double(mLocation.getLatitude())).toString()));
gpsData.add(new BasicNameValuePair("Longitude", (new Double(mLocation.getLongitude())).toString()));
gpsData.add(new BasicNameValuePair("Provider", mLocation.getProvider()));
}
else
{
List<NameValuePair> gpsData = new ArrayList<NameValuePair>();
gpsData.add(new BasicNameValuePair("Error", "Location is unknown"));
}
}
};
@Override
public void onCreate() {
mLocationManager = (LocationManager)getSystemService(LOCATION_SERVICE);
mLocationListener = new GPSListener(getApplicationContext());
};
@Override
public void onStart(Intent intent, int startId) {
Message mMessage = new Message();
mMessage.arg1 = 1;
mHandler.sendMessage(mMessage);
if(listenPeriod == 0)
{
mTimer = new Timer("GPSTask");
mTimer.schedule(mTimerTask, 0);
mTimer.schedule(selfStopTask, 60000);
}
else if(listenPeriod>0)
{
mTimer = new Timer("GPSTask");
mTimer.schedule(mTimerTask, 0, listenPeriod);
}
};
@Override
public void onDestroy() {
Message mMessage = new Message();
mMessage.arg1 = 0;
mHandler.sendMessage(mMessage);
//GPSTracer.mLocationManager.removeUpdates(GPSTracer.mLocationListener);
iGPSTracer = null;
mTimer.cancel();
mTimerTask.cancel();
mTimer = null;
mTimerTask = null;
mLocationListener = null;
mLocationManager = null;
};
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
}
和實施LocationListener的的:
public class GPSListener implements LocationListener{
Context context;
public GPSListener(Context appContext) {
context = appContext;
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onLocationChanged(Location location) {
//GPSTracer.mLocationManager.removeUpdates(GPSTracer.mLocationListener);
GPSTracer.mLocation = location;
}
}
我希望這會幫助別人......) 附:感謝Dave MacLean和EboMike!並隨時提問;)
從文檔:minTime - 通知的最小時間間隔,以毫秒爲單位。此字段僅用作節省電量的提示,位置更新之間的實際時間可能大於或小於此值。 – EboMike 2010-11-30 18:33:00
soooo ...基本上我必須實現一些額外的機制來組織更新週期(基於minTime值)? – 2010-11-30 19:42:03
不是。你在真實的設備上試過了嗎? – EboMike 2010-11-30 19:56:37