Hintergrund-Service mit Standort-Listener in Android

Ich schaffe einen Hintergrunddienst, der in seinem eigenen Prozess laufen wird. Es sollte mir erlauben, zuzuhören, wenn sich der Gerätestandort geändert hat. Ich sollte in der Lage sein, Kriterien wie die Distanz zu ändern, bevor Sie die Benutzeroberfläche zu ändern.

Wie kann ich dasselbe machen? Ich habe ein wenig Kenntnis von Service und LocationListener Implementierungen. Irgendwelche Tutorials um das Netz würden geschätzt.

  • Visual Studio (2015) Emulator für Android nicht funktioniert - XDE.exe - Exit Code 10
  • Wie viele AsyncTasks kann ich in einer einzigen Prozessanwendung ausführen
  • Wie man Schüttgut in sqlite in android einbringt
  • Warum die Soft-Tastatur zeigt oder nicht, wenn eine Aktivität beginnt?
  • Sind Android App Widgets (für Home Screen) erlaubt Gesten?
  • Größe von MediaStyle LargeIcon
  • Ich habe einen Backlink vom Stacküberlauf bekommen, aber ich habe nicht viel davon verstanden.

  • NextFocusDown funktioniert nicht mit AutoCopmleteTextView
  • Wie kann man die Hintergrundfarbe eines WebViews auf einen Hex-Wert einstellen?
  • Android: Wie man den Bildschirm ein- und ausschaltet programmgesteuert?
  • Es gibt keine debug.keystore in .android Ordner
  • Hinzufügen von TextView in LinearLayout wie Chips wie Gmail-Adresse Vorschlag
  • Der Hyper-V-Administrator-Gruppen-Exit-Code 2220 kann nicht hinzugefügt werden
  • 4 Solutions collect form web for “Hintergrund-Service mit Standort-Listener in Android”

    Zuerst müssen Sie einen Service erstellen. In diesem Service erstellen Sie eine Klasse, die LocationListener . Verwenden Sie hierzu den folgenden Code-Snippet von Service :

     public class LocationService extends Service { public static final String BROADCAST_ACTION = "Hello World"; private static final int TWO_MINUTES = 1000 * 60 * 2; public LocationManager locationManager; public MyLocationListener listener; public Location previousBestLocation = null; Intent intent; int counter = 0; @Override public void onCreate() { super.onCreate(); intent = new Intent(BROADCAST_ACTION); } @Override public void onStart(Intent intent, int startId) { locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); listener = new MyLocationListener(); locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 4000, 0, listener); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 4000, 0, listener); } @Override public IBinder onBind(Intent intent) { return null; } protected boolean isBetterLocation(Location location, Location currentBestLocation) { if (currentBestLocation == null) { // A new location is always better than no location return true; } // Check whether the new location fix is newer or older long timeDelta = location.getTime() - currentBestLocation.getTime(); boolean isSignificantlyNewer = timeDelta > TWO_MINUTES; boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES; boolean isNewer = timeDelta > 0; // If it's been more than two minutes since the current location, use the new location // because the user has likely moved if (isSignificantlyNewer) { return true; // If the new location is more than two minutes older, it must be worse } else if (isSignificantlyOlder) { return false; } // Check whether the new location fix is more or less accurate int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy()); boolean isLessAccurate = accuracyDelta > 0; boolean isMoreAccurate = accuracyDelta < 0; boolean isSignificantlyLessAccurate = accuracyDelta > 200; // Check if the old and new location are from the same provider boolean isFromSameProvider = isSameProvider(location.getProvider(), currentBestLocation.getProvider()); // Determine location quality using a combination of timeliness and accuracy if (isMoreAccurate) { return true; } else if (isNewer && !isLessAccurate) { return true; } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) { return true; } return false; } /** Checks whether two providers are the same */ private boolean isSameProvider(String provider1, String provider2) { if (provider1 == null) { return provider2 == null; } return provider1.equals(provider2); } @Override public void onDestroy() { // handler.removeCallbacks(sendUpdatesToUI); super.onDestroy(); Log.v("STOP_SERVICE", "DONE"); locationManager.removeUpdates(listener); } public static Thread performOnBackgroundThread(final Runnable runnable) { final Thread t = new Thread() { @Override public void run() { try { runnable.run(); } finally { } } }; t.start(); return t; } public class MyLocationListener implements LocationListener { public void onLocationChanged(final Location loc) { Log.i("**************************************", "Location changed"); if(isBetterLocation(loc, previousBestLocation)) { loc.getLatitude(); loc.getLongitude(); intent.putExtra("Latitude", loc.getLatitude()); intent.putExtra("Longitude", loc.getLongitude()); intent.putExtra("Provider", loc.getProvider()); sendBroadcast(intent); } } public void onProviderDisabled(String provider) { Toast.makeText( getApplicationContext(), "Gps Disabled", Toast.LENGTH_SHORT ).show(); } public void onProviderEnabled(String provider) { Toast.makeText( getApplicationContext(), "Gps Enabled", Toast.LENGTH_SHORT).show(); } public void onStatusChanged(String provider, int status, Bundle extras) { } } } 

    Füge diesen Service irgendwo in deinem Projekt hinzu, so wie du willst! 🙂

    Ich weiß, ich sende diese Antwort wenig spät, aber ich fühlte, dass es sich lohnt, den Google-Sicherungsort-Provider-Service zu nutzen, um den aktuellen Standort zu erhalten.

    Hauptmerkmale dieser API sind:

    1.Simple APIs: Ermöglicht es Ihnen, Ihre Genauigkeit sowie Stromverbrauch zu wählen.

    2.Immediately available: Gibt Ihren Apps sofortigen Zugang zum besten, neuesten Standort.

    3.Power-Effizienz: Es wählt den effizientesten Weg, um den Standort mit weniger Stromverbrauch zu bekommen

    4.Versatilität: Erfüllt eine breite Palette von Bedürfnissen, von Vordergrundgebrauch, die hochgenaue Lage zu Hintergrund verwenden müssen, die periodische Standortaktualisierungen mit vernachlässigbarer Leistungseinfluss benötigen.

    Es ist flexibel in der Aktualisierung auch in der Lage. Wenn Sie den aktuellen Standort nur dann wünschen, wenn Ihre App startet, können Sie die Methode getLastLocation(GoogleApiClient) verwenden.

    Wenn Sie Ihren Standort kontinuierlich aktualisieren möchten, können Sie requestLocationUpdates(GoogleApiClient,LocationRequest, LocationListener)

    Sie finden einen sehr netten Blog über Sicherungsort hier und google doc für Sicherungsort finden Sie auch hier .

    Aktualisieren

    Laut Entwickler-Docs, die von Android O starten, haben sie neue Grenzen für den Hintergrundort hinzugefügt.

    Wenn Ihre App im Hintergrund läuft, berechnet der Standort-System-Service nur noch ein paar Mal pro Stunde einen neuen Standort für Ihre App. Dies ist der Fall, auch wenn Ihre App häufiger Standortaktualisierungen anfordert. Allerdings, wenn Ihre App läuft im Vordergrund, gibt es keine Änderung der Standorte Abtastraten im Vergleich zu Android 7.1.1 (API Level 25).

    Hintergrund Standort Service und ich werde auch nach dem Kill App starten.

    MainActivity.java

     public class MainActivity extends AppCompatActivity { AlarmManager alarmManager; Button stop; PendingIntent pendingIntent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (alarmManager == null) { alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(this, AlarmReceive.class); pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 30000, pendingIntent); } } } 

    BookingTrackingService.java

     public class BookingTrackingService extends Service implements LocationListener { private static final String TAG = "BookingTrackingService"; private Context context; boolean isGPSEnable = false; boolean isNetworkEnable = false; double latitude, longitude; LocationManager locationManager; Location location; private Handler mHandler = new Handler(); private Timer mTimer = null; long notify_interval = 30000; public double track_lat = 0.0; public double track_lng = 0.0; public static String str_receiver = "servicetutorial.service.receiver"; Intent intent; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); mTimer = new Timer(); mTimer.schedule(new TimerTaskToGetLocation(), 5, notify_interval); intent = new Intent(str_receiver); } @Override public int onStartCommand(Intent intent, int flags, int startId) { this.context = this; return START_NOT_STICKY; } @Override public void onDestroy() { super.onDestroy(); Log.e(TAG, "onDestroy <<"); if (mTimer != null) { mTimer.cancel(); } } private void trackLocation() { Log.e(TAG, "trackLocation"); String TAG_TRACK_LOCATION = "trackLocation"; Map<String, String> params = new HashMap<>(); params.put("latitude", "" + track_lat); params.put("longitude", "" + track_lng); Log.e(TAG, "param_track_location >> " + params.toString()); stopSelf(); mTimer.cancel(); } @Override public void onLocationChanged(Location location) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } /******************************/ private void fn_getlocation() { locationManager = (LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE); isGPSEnable = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); isNetworkEnable = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); if (!isGPSEnable && !isNetworkEnable) { Log.e(TAG, "CAN'T GET LOCATION"); stopSelf(); } else { if (isNetworkEnable) { location = null; locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, this); if (locationManager != null) { location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { Log.e(TAG, "isNetworkEnable latitude" + location.getLatitude() + "\nlongitude" + location.getLongitude() + ""); latitude = location.getLatitude(); longitude = location.getLongitude(); track_lat = latitude; track_lng = longitude; // fn_update(location); } } } if (isGPSEnable) { location = null; locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this); if (locationManager != null) { location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { Log.e(TAG, "isGPSEnable latitude" + location.getLatitude() + "\nlongitude" + location.getLongitude() + ""); latitude = location.getLatitude(); longitude = location.getLongitude(); track_lat = latitude; track_lng = longitude; // fn_update(location); } } } Log.e(TAG, "START SERVICE"); trackLocation(); } } private class TimerTaskToGetLocation extends TimerTask { @Override public void run() { mHandler.post(new Runnable() { @Override public void run() { fn_getlocation(); } }); } } // private void fn_update(Location location) { // // intent.putExtra("latutide", location.getLatitude() + ""); // intent.putExtra("longitude", location.getLongitude() + ""); // sendBroadcast(intent); // } } 

    AlarmReceive.java (BroadcastReceiver)

     public class AlarmReceive extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.e("Service_call_" , "You are in AlarmReceive class."); Intent background = new Intent(context, BookingTrackingService.class); // Intent background = new Intent(context, GoogleService.class); Log.e("AlarmReceive ","testing called broadcast called"); context.startService(background); } } 

    AndroidManifest.xml

     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <service android:name=".ServiceAndBroadcast.BookingTrackingService" android:enabled="true" /> <receiver android:name=".ServiceAndBroadcast.AlarmReceive" android:exported="false"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> 

    Sehr einfach keine Notwendigkeit schaffen Klasse verlängert LocationListener 1- Variable

     private LocationManager mLocationManager; private LocationListener mLocationListener; private static double currentLat =0; private static double currentLon =0; 

    2- onStartService ()

     @Override public void onStartService() { addListenerLocation(); } 

    3- Methode addListenerLocation ()

      private void addListenerLocation() { mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); mLocationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { currentLat = location.getLatitude(); currentLon = location.getLongitude(); Toast.makeText(getBaseContext(),currentLat+"-"+currentLon, Toast.LENGTH_SHORT).show(); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { Location lastKnownLocation = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if(lastKnownLocation!=null){ currentLat = lastKnownLocation.getLatitude(); currentLon = lastKnownLocation.getLongitude(); } } @Override public void onProviderDisabled(String provider) { } }; mLocationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 500, 10, mLocationListener); } 

    4- onDestroy ()

     @Override public void onDestroy() { super.onDestroy(); mLocationManager.removeUpdates(mLocationListener); } 
    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.