2016-07-16 5 views
2

Ich benutze ein Android-Beispiel für einen Dienst, der aktuellen Standort erhält, funktioniert es gut, aber ich würde gerne wissen, welche Änderungen ich hätte machen müssen, so dass es nur für die aktuelle überprüft Ort in bestimmten Zeitintervallen (z. B. alle 2 Minuten), anstatt es kontinuierlich zu tun.Ändern eines Android-Dienstes zur Ausführung in bestimmten Abständen

public class YourService extends Service implements LocationListener { 
    LocationManager mLocationManager; 

public IBinder onBind(Intent intent) { 
    // This won't be a bound service, so simply return null 
    Log.v("WEAVER_", "Service_OnBind..."); 
    return null; 
} 

@Override 
public void onCreate() { 
    // This will be called when your Service is created for the first time 
    // Just do any operations you need in this method. 
    Log.v("WEAVER_", "Service_OnCreate..."); 

    mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 

    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 
      1, this); 


} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    return super.onStartCommand(intent, flags, startId); 
} 
@Override 
public void onDestroy(){ 
    super.onDestroy(); 
    Log.v("WEAVER_","Service_OnDestroy"); 
    mLocationManager.removeUpdates(this); 
    mLocationManager = null; 
} 
@Override 
public void onLocationChanged(Location location) { 
    Log.v("WEAVER_","Service_Location Change"); 

    String msg = "New Latitude: " + location.getLatitude() 
      + "New Longitude: " + location.getLongitude(); 








     Toast.makeText(getBaseContext(), msg, Toast.LENGTH_LONG).show(); 

} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 

} 

@Override 
public void onProviderEnabled(String provider) { 

} 



@Override 
public void onProviderDisabled(String provider) { 

} 

}

Antwort

0

Ich weiß nicht, Ihre genaue Absichten für diese, aber es könnte sich lohnen, für Sie zu schauen, um anstelle eines Dienstes eine IntentService in Verwendung. Der IntentService wird in einem separaten Thread und nicht im Hauptthread ausgeführt, und Sie können ihn auch starten. Der Intent-Dienst wird das tun, was Sie beabsichtigen, nämlich den Speicherort abzurufen, und dann beendet er sich.

Dann gilt für die Dauer der Zeit gibt es mehrere Möglichkeiten, dies zu tun, aber ich würde Ihnen empfehlen, einen Blick haben: https://developer.android.com/training/scheduling/alarms.html

Wenn Sie eine IntentService gehen Sie rufen Sie einfach an (einige Kontext) .startService, wenn die AlarmManager löst aus. Alternative Sie könnten den Dienst immer aktiv haben (wenn Sie START_STICKY in onStartCommand zurückgeben) und den Alarm dort eingeben.

0

Hier ist etwas, was ich tun konnte, um den Standort in Abständen zu überprüfen. Dies verwendet den GoogleAPIClient, also müssen Sie diesen zu Ihrem Projekt hinzufügen, wenn dies funktioniert. Diese Lösung benötigt auch die Verwendung von LocationRequest und FusedLocationProviderApi.

Deklarieren GoogleAPIClient wie folgt aus:

public class YourService extends Service implements GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener, LocationListener { 
    private static GoogleApiClient googleApiClient; 
    private static FusedLocationProviderApi fusedLocation = LocationServices.FusedLocationApi; 
    private static LocationRequest locationRequest; 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     googleApiClient = new GoogleApiClient.Builder(this) 
      .addApi(LocationServices.API) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .build(); 

     locationRequest = new LocationRequest(); 
     locationRequest.setInterval(5000); // look at provider every 5 seconds 
     locationRequest.setFastestInterval(1000); // or one second if its convenient 
     locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 

     googleApiClient.connect(); 
     ... // other code here 
    } 

Dann fügen Sie die Location zu fusedLocation wie:

@Override // This is called when googleApiClient has connected 
public void onConnected(@Nullable Bundle bundle) { 
    fusedLocation.requestLocationUpdates(<googleApiClient here>, locationRequest, this); 
} 

Hoffnung, das hilft. Wenn Sie möchten, könnte ich Ihnen auch zeigen, wie man so etwas mit Timertask