我實現了一個機器人的服務,開機啓動: MyService.java
的Android服務LocationListener的未激活
package com.example.testservicelogging;
import com.example.testservicelogging.MyBroadcastReceiver;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.widget.Toast;
public class MyService extends Service implements LocationListener {
LocationManager lm;
PendingIntent pendingIntent;
LocationListener locationListener;
public MyService() {
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//TODO do something useful
//Toast.makeText(getBaseContext(), "Got in!!!", Toast.LENGTH_SHORT).show();
System.out.println("Got in");
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
//---use the LocationManager class to obtain locations data---
lm = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
Intent i = new Intent(this, MyBroadcastReceiver.class);
pendingIntent = PendingIntent.getBroadcast(
this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
//---request for location updates using GPS---
lm.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
6000,
5,
pendingIntent);
return START_STICKY;
}
@Override
public void onDestroy() {
//---remove the pending intent---
lm.removeUpdates(pendingIntent);
super.onDestroy();
Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}
@Override
public void onLocationChanged(Location arg0) {
// TODO Auto-generated method stub
Toast.makeText(this, "onLocationChanged", Toast.LENGTH_LONG).show();
}
@Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub
Toast.makeText(this, "onProviderDisabled", Toast.LENGTH_LONG).show();
}
@Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub
Toast.makeText(this, "onProviderEnabled", Toast.LENGTH_LONG).show();
}
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub
Toast.makeText(this, "onStatusChanged", Toast.LENGTH_LONG).show();
}
}
也BroadcastReceiver
類:
package com.example.testservicelogging;
import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationManager;
import android.util.Log;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent t=new Intent(context, MyService.class);
t.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startService(t);
String locationKey = LocationManager.KEY_LOCATION_CHANGED;
String providerEnabledKey = LocationManager.KEY_PROVIDER_ENABLED;
//Toast.makeText(context, "INSIDE!!!", Toast.LENGTH_SHORT).show();
System.out.println("INSIDE");
if (intent.hasExtra(providerEnabledKey)) {
if (!intent.getBooleanExtra(providerEnabledKey, true)) {
Toast.makeText(context,
"Provider disabled",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context,
"Provider enabled",
Toast.LENGTH_SHORT).show();
}
}
if (intent.hasExtra(locationKey)) {
Location loc = (Location)intent.getExtras().get(locationKey);
Toast.makeText(context,
"Location changed : Lat: " + loc.getLatitude() +
" Lng: " + loc.getLongitude(),
Toast.LENGTH_SHORT).show();
//do something with the coordinates returned
}
}
}
我面臨的一些問題:
- (也是最重要的):引導時的服務負載,但即使我看到t他GPS圖標閃爍,它永遠不會返回座標!我做錯了什麼?
- 我想在預定義的時間間隔內獲取座標(例如,每天從08:00至18:00每15分鐘一次)。我怎樣才能實現呢?
- 即使我提高了100000毫秒和500的距離來激活requestLocationUpdates,它有時會每隔2-5秒運行一次,即使我保持靜止!我怎樣才能克服?
非常感謝您的幫助!