Ich verwende einen Standort-Listener-Dienst, um den aktuellen Standort des Benutzers für alle paar Sekunden zu aktualisieren. Ich habe auch einen WakeLock verwendet, um den Hörer im Hintergrund arbeiten zu lassen. Jetzt funktioniert alles gut, aber ich kann den Location-Listener nicht stoppen. Selbst wenn die App zwangsweise geschlossen wird, aktualisiert der Listener den Benutzerstandort in der Datenbank.Wie kann ein Standort-Listener-Dienst gestoppt werden? (nicht zu stoppen)
Lage Zuhörer:
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.os.PowerManager;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import android.widget.Toast;
import com.google.android.gms.maps.model.LatLng;
public class MyLocationService extends Service {
private static final String TAG = "MyLocationService";
private LocationManager mLocationManager = null;
private static final int LOCATION_INTERVAL = 3000;
private static final float LOCATION_DISTANCE = 0f;
Context context = this;
PowerManager.WakeLock wakeLock;
public int e=0;
LocationListener[] mLocationListeners = new LocationListener[]{
new LocationListener(LocationManager.GPS_PROVIDER),
new LocationListener(LocationManager.NETWORK_PROVIDER)
};
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG, "onStartCommand");
super.onStartCommand(intent, flags, startId);
Toast.makeText(this, "MyService Started.", Toast.LENGTH_SHORT).show();
return START_STICKY;
}
@Override
public void onCreate() {
Log.e(TAG, "onCreate");
initializeLocationManager();
PowerManager mgr = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
wakeLock= mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
wakeLock.acquire();
try {
mLocationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,
mLocationListeners[1]);
} catch (java.lang.SecurityException ex) {
Log.i(TAG, "fail to request location update, ignore", ex);
} catch (IllegalArgumentException ex) {
Log.d(TAG, "network provider does not exist, " + ex.getMessage());
}
try {
mLocationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,
mLocationListeners[0]);
} catch (java.lang.SecurityException ex) {
Log.i(TAG, "fail to request location update, ignore", ex);
} catch (IllegalArgumentException ex) {
Log.d(TAG, "gps provider does not exist " + ex.getMessage());
}
}
@Override
public void onDestroy() {
Log.e(TAG, "onDestroy");
wakeLock.release();
super.onDestroy();
if (mLocationManager != null) {
for (int i = 0; i < mLocationListeners.length; i++) {
try {
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
mLocationManager.removeUpdates(mLocationListeners[i]);
} catch (Exception ex) {
Log.i(TAG, "fail to remove location listners, ignore", ex);
}
}
}
}
private void initializeLocationManager() {
Log.e(TAG, "initializeLocationManager");
if (mLocationManager == null) {
mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
}
}
// create LocationListener class to get location updates
private class LocationListener implements android.location.LocationListener
{
Location mLastLocation;
double latitude;
double longitude;
LatLng latLngcurrent;
public LocationListener(String provider)
{
Log.e(TAG, "LocationListener " + provider);
mLastLocation = new Location(provider);
}
@Override
public void onLocationChanged(Location location)
{
Log.e(TAG, "onLocationChanged: " + location);
mLastLocation.set(location);
latitude = location.getLatitude();
longitude = location.getLongitude();
Store.latu=latitude;
Store.longu=longitude;
latLngcurrent = new LatLng(location.getLatitude(), location.getLongitude());
Toast.makeText(context,"Location " + String.valueOf(e), Toast.LENGTH_SHORT).show();
e++;
Toast.makeText(MyLocationService.this,Store.latu+" "+Store.longu, Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderDisabled(String provider)
{
Log.e(TAG, "onProviderDisabled: " + provider);
}
@Override
public void onProviderEnabled(String provider)
{
Log.e(TAG, "onProviderEnabled: " + provider);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
{
Log.e(TAG, "onStatusChanged: " + provider);
}
}
}
Starten des Service Absicht: (von mainactivity)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
Intent serviceIntent = new Intent(context , MyLocationService.class);
context.startService(serviceIntent );
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
checkLocationPermission();
}
if (!isGooglePlayServicesAvailable()) {
finish();
} else {
Log.d("onCreate", "Google Play Services available.");
}
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
Stoppen der Absicht: (von mainactivity)
private class LogOutTimerTask extends TimerTask
{
@Override
public void run()
{
Intent i = new Intent(MapsActivity.this, Login.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
Intent intent = new Intent(MapsActivity.this, MyLocationService.class);
stopService(intent);
finish();
}
}
Die Stop-Intent wird aufgerufen, wenn der Benutzer sich abmeldet, jetzt wird die onDestroy() - Methode in der Serviceklasse aufgerufen, aber der Prozess wird nicht gestoppt. Wenn die Anwendung zwangsweise geschlossen wird, wird onDestroy() nicht einmal aufgerufen. In beiden Fällen wird der Prozess fortgesetzt und aktualisiert die Werte in DB. Vielen Dank im Voraus.
wird 'removeUpdates()' aufgerufen? oder die Methode gibt wegen der Berechtigungen "IF" zurück? obwohl, warum überprüfen Sie die Erlaubnis beim Entfernen der Listener? das sollte irgendwo in oder um 'initializeLocationManager()' – Yazan
Ich habe nicht überprüft, ob die removeupdates() aufgerufen wird. Ich habe Berechtigungen hinzugefügt, weil Android Studio mir empfohlen hat. @ Yazan –
Ich bezweifle, dass dieser Ort ist gut, um eine Erlaubnis zu beantragen (während der Service zu zerstören ?!) Allerdings ist es nicht so gut, es in die Schleife zu legen, können Sie fragen, es einmal (vor der Schleife) auch versuchen, hinzuzufügen ein Protokoll kurz vor der 'removeUpdates()' etwas wie diese 'Log.i (TAG," Listener entfernen ... ");' und sehen, ob es in der Logcat erscheint – Yazan