2016-04-11 17 views
1

Ich bin neu auf Android und Arbeiten an einer App, um die Funktionalität zu erreichen, meine Standort-Updates, auch wenn die Anwendung quit.ie ist, sollte meine aktuelle Position auf dem Server unabhängig von dem Zustand zu aktualisieren meiner Anwendung - aktiv von beendet.Android-Standort-Updates als Hintergrund-Service

Können Sie mir vorschlagen, welchen Ansatz sollte ich für die gleiche folgen? Würde Ihre Hilfe wirklich zu schätzen wissen ...

Antwort

6

Hier ist der Code, um den Standort des Benutzers alle X Minuten oder alle X Meter mit einem Handler zu erhalten.

Location gpslocation = null; 

    private static final int GPS_TIME_INTERVAL = 60000; // get gps location every 1 min 
    private static final int GPS_DISTANCE= 1000; // set the distance value in meter 

    /* 
     for frequently getting current position then above object value set to 0 for both you will get continues location but it drown the battery 
    */ 

    private void obtainLocation(){ 
    if(locMan==null) 
     locMan = (LocationManager) getSystemService(LOCATION_SERVICE); 

     if(locMan.isProviderEnabled(LocationManager.GPS_PROVIDER)){ 
      gpslocation = locMan.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
      if(isLocationListener){ 
       locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
          GPS_TIME_INTERVAL, GPS_DISTANCE, GPSListener); 
        } 
       } 
      } 
    } 

Handler

private static final int HANDLER_DELAY = 1000*60*5; 

    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
      public void run() { 
       myLocation = obtainLocation(); 
       handler.postDelayed(this, HANDLER_DELAY); 
      } 
     }, START_HANDLER_DELAY); 

GPS Location

private LocationListener GPSListener = new LocationListener(){ 
    public void onLocationChanged(Location location) { 
     // update your location 

    } 

    public void onProviderDisabled(String provider) { 
    } 

    public void onProviderEnabled(String provider) { 
    } 

    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 
}; 
+0

Danke für den Code, können Sie erklären, wie Sie einschließlich locMan.removeUpdates (GPSListener); Ich meine, wenn du den Hörer entfernst, wie wird er dann die Standortänderung erfassen? – lionheart

+0

Das war versehentlich..ich habe es bearbeitet – Hackose

4

Dies ist der Code für die Aktualisierung der Breite und Länge des Geräts in einem Hintergrunddienst und wird immer in einem Hintergrund arbeiten. Der Dienst wird niemals gestoppt, wenn jemand (manuell oder System) ihn automatisch startet.

public class LocationService extends Service implements LocationListener { 

     LocationManager m_locationManager; 

     @Override 
     public void onCreate() { 

      this.m_locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 

       Toast.makeText(getApplicationContext(), "Location Service starts", Toast.LENGTH_SHORT).show(); 

     } 



     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
      //TODO do something useful 
      Toast.makeText(getApplicationContext(), "Service starts", Toast.LENGTH_SHORT).show(); 



      // Here I offer two options: either you are using satellites or the Wi-Fi services to get user's location 
      // this.m_locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3000, 0, this); // User's location is retrieve every 3 seconds 
      this.m_locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 

      this.m_locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, this); 
     return START_STICKY; 
     } 


     @Override 
     public IBinder onBind(Intent intent) { 
      //TODO for communication return IBinder implementation 
      return null; 
     } 


     @Override 
     public void onDestroy() { 
      super.onDestroy(); 
      Toast.makeText(getApplicationContext(), "Service Task destroyed", Toast.LENGTH_LONG).show(); 
      Intent myIntent = new Intent(getApplicationContext(), LocationService.class); 

      PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, myIntent, 0); 

      AlarmManager alarmManager1 = (AlarmManager) getSystemService(ALARM_SERVICE); 

      Calendar calendar = Calendar.getInstance(); 

      calendar.setTimeInMillis(System.currentTimeMillis()); 

      calendar.add(Calendar.SECOND, 10); 

      alarmManager1.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 

      Toast.makeText(getApplicationContext(), "Start Alarm", Toast.LENGTH_SHORT).show(); 
     } 



     @Override 
     public void onTaskRemoved(Intent rootIntent) { 
      super.onTaskRemoved(rootIntent); 
       Intent myIntent = new Intent(getApplicationContext(), LocationService.class); 

       PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, myIntent, 0); 

       AlarmManager alarmManager1 = (AlarmManager) getSystemService(ALARM_SERVICE); 

       Calendar calendar = Calendar.getInstance(); 

       calendar.setTimeInMillis(System.currentTimeMillis()); 

       calendar.add(Calendar.SECOND, 10); 

       alarmManager1.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 

       Toast.makeText(getApplicationContext(), "Start Alarm", Toast.LENGTH_SHORT).show(); 



     } 


     @Override 
     public void onLocationChanged(Location loc) { 
      if (loc == null) // Filtering out null values 
       return ; 

      Double lat = loc.getLatitude(); 
      Double lon = loc.getLongitude(); 
    //  Toast.makeText(getApplicationContext(),"Latitude = "+lat+ "\nLongitude = "+lon, Toast.LENGTH_SHORT).show(); 

     // new UpdateLatitudeLongitude(LocationService.this, lat, lon,).execute(); 

//Calling AsyncTask for upload latitude and longitude 
     } 

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

     } 

     @Override 
     public void onProviderEnabled(String provider) { 

     } 

     @Override 
     public void onProviderDisabled(String provider) { 

     } 






     }