0

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.

+0

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

+0

Ich habe nicht überprüft, ob die removeupdates() aufgerufen wird. Ich habe Berechtigungen hinzugefügt, weil Android Studio mir empfohlen hat. @ Yazan –

+1

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

Antwort

1

Lösung: Ich habe endlich die Lösung dafür gefunden. Wie @Yazan sagte, habe ich die Berechtigungen von onDestroy() -Methode entfernt, die dem Dienst hilft, manuell zu stoppen, wenn sich der Benutzer abmeldet. Und um den Dienst zu beenden, wenn die App geschlossen ist, fügen Sie in Ihrem Manifest während der Verwendung des Tags auch diese Zeile hinzu.

Snippet:

<service android:name=".MyLocationService" 
android:stopWithTask="true"></service> 

stopWithTask den Dienst beenden, wenn wir die Anwendung schließen zwingen und die Location wird auch gestoppt.

here ist die Dokumentation. Nach dem Hinzufügen funktioniert meine Anwendung gut.

Verwandte Themen