Enviar las actualizaciones de la ubicación a IntentService

¿Cómo se pueden enviar las actualizaciones de ubicación directamente al servicio de intención? El siguiente enfoque no funciona. Se llama a la función OnConnected pero la intención nunca se recibe en el servicio:

... private PendingIntent getLocationPendingIntent(boolean shouldCreate) { Intent broadcast = new Intent(m_context,LocationUpdateService.class); int flags = shouldCreate ? 0 : PendingIntent.FLAG_NO_CREATE; return PendingIntent.getService(m_context, 0, broadcast, flags); } @Override public void onConnected(Bundle arg0) { PendingIntent locationPendingIntent = getLocationPendingIntent(true); LocationRequest locationRequest = new LocationRequest(); locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); locationRequest.setInterval(LOCATION_UPDATE_INTERVAL); locationRequest.setFastestInterval(LOCATION_FASTEST_UPDATE_INTERVAL); LocationServices.FusedLocationApi.requestLocationUpdates(m_googleApiClient, locationRequest,locationPendingIntent); } ... 

Servicio de Intención:

 import android.app.IntentService; import android.content.Intent; import android.util.Log; public class LocationUpdateService extends IntentService { public LocationUpdateService() { super(LocationUpdateService.class.getName()); } @Override public int onStartCommand(Intent intent, int flags, int startID) { super.onStartCommand(intent, flags, startID); Log.d("LocationUpdateService","Location received"); return START_REDELIVER_INTENT; } @Override protected void onHandleIntent(Intent intent) { Log.d("LocationUpdateService","Intent received"); } } 

Archivo de manifiesto:

 ... <service android:name=".LocationUpdateService" /> ... 

Aquí está trabajando y probado código que establece con éxito un IntentService como el receptor de la Intención incluida en el PendingIntent utilizado para las actualizaciones de ubicación, basado en el código encontrado aquí .

En primer lugar, el IntentService :

 import android.app.IntentService; import android.content.Intent; import android.location.Location; import android.util.Log; import com.google.android.gms.location.FusedLocationProviderApi; import com.google.android.gms.location.LocationResult; public class LocationUpdateService extends IntentService { private final String TAG = "LocationUpdateService"; Location location; public LocationUpdateService() { super("LocationUpdateService"); } @Override protected void onHandleIntent(Intent intent) { if (LocationResult.hasResult(intent)) { LocationResult locationResult = LocationResult.extractResult(intent); Location location = locationResult.getLastLocation(); if (location != null) { Log.d("locationtesting", "accuracy: " + location.getAccuracy() + " lat: " + location.getLatitude() + " lon: " + location.getLongitude()); } } } } 

Y aquí está el código de actividad que se registra para las actualizaciones de ubicación con un PendingIntent que se envía al IntentService :

 import android.app.PendingIntent; import android.os.Bundle; import android.content.Intent; import android.app.Activity; import android.widget.Toast; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationServices; public class MainActivity extends Activity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { LocationRequest mLocationRequest; GoogleApiClient mGoogleApiClient; PendingIntent mRequestLocationUpdatesPendingIntent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); buildGoogleApiClient(); mGoogleApiClient.connect(); } @Override protected void onPause(){ super.onPause(); if (mGoogleApiClient != null) { LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, mRequestLocationUpdatesPendingIntent); } } protected synchronized void buildGoogleApiClient() { Toast.makeText(this,"buildGoogleApiClient",Toast.LENGTH_SHORT).show(); mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); } @Override public void onConnected(Bundle bundle) { Toast.makeText(this,"onConnected",Toast.LENGTH_SHORT).show(); mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(10); mLocationRequest.setFastestInterval(10); mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); //mLocationRequest.setSmallestDisplacement(0.1F); // create the Intent to use WebViewActivity to handle results Intent mRequestLocationUpdatesIntent = new Intent(this, LocationUpdateService.class); // create a PendingIntent mRequestLocationUpdatesPendingIntent = PendingIntent.getService(getApplicationContext(), 0, mRequestLocationUpdatesIntent, PendingIntent.FLAG_UPDATE_CURRENT); // request location updates LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, mRequestLocationUpdatesPendingIntent); } @Override public void onConnectionSuspended(int i) { Toast.makeText(this,"onConnectionSuspended",Toast.LENGTH_SHORT).show(); } @Override public void onConnectionFailed(ConnectionResult connectionResult) { Toast.makeText(this,"onConnectionFailed",Toast.LENGTH_SHORT).show(); } } 

Registros resultantes:

  D/locationtesting﹕ accuracy: 10.0 lat: 37.779702 lon: -122.3931595 D/locationtesting﹕ accuracy: 10.0 lat: 37.7797023 lon: -122.3931594 D/locationtesting﹕ accuracy: 10.0 lat: 37.7797022 lon: -122.3931596 D/locationtesting﹕ accuracy: 10.0 lat: 37.7797021 lon: -122.3931597 D/locationtesting﹕ accuracy: 10.0 lat: 37.7797021 lon: -122.3931596 D/locationtesting﹕ accuracy: 10.0 lat: 37.7797019 lon: -122.3931597 D/locationtesting﹕ accuracy: 10.0 lat: 37.7797019 lon: -122.3931597 

Los servicios de intención por su naturaleza están destinados a tareas terminales, tales como recibir la intención de llamar actividad o fragmento, iniciar una tarea en un hilo separado y terminar en silencio, sin notificar a ninguna entidad de su terminación. También hay una documentación de la nota que onStartCommand no debe ser anulada para Intent Services ([IntentService] [1]). Mi suposición es que su servicio se termina cuando usted espera que esté vivo y por lo tanto, la intención no se entrega correctamente.

Servicios vinculados sería una opción más adecuada, ya que permiten a los diferentes componentes para adjuntarse a sí mismos y realizar la comunicación necesaria.

Usted no puede hacerlo directamente – quiero decir requestLocationUpdates y obtener esas actualizaciones en IntentService .

Lo que puedes hacer es tener un Service en segundo plano que solicite esas actualizaciones a través de requestLocationUpdates y se ejecuta todo el tiempo que quieras (recuerda el caso cuando el dispositivo se duerme). Entonces de ese Service cuando la actualización de la localización allí es recibió el fuego él hacia IntentService y la manija allí.

Puede utilizar el método getService () de pendingIntent y en onStartCommand () del servicio puede obtener la intención correspondiente. GetBroadcast () envía una emisión para la que necesita registrar un receptor de difusión para escuchar. Espero que esto ayude.

  • Android: mantener el servicio en ejecución cuando se mata la aplicación
  • Cómo determinar si la aplicación se ejecuta desde el servicio
  • Async tarea no funciona correctamente (doInBackground no se ejecuta) cuando el servicio se ejecuta en segundo plano, Android
  • ¿AlarmManager requiere que PendingIntent sea del tipo BroadcastReceiver?
  • ¿El enfoque de diseño de la aplicación de cliente restante en google io 2010 sigue actualizado?
  • Antecedentes Proceso para escanear la ubicación del usuario a intervalos regulares y actualizar la base de datos local incluso cuando la aplicación no está abierta
  • ¿Cómo usar correctamente la biblioteca Volley con IntentService?
  • ¿Cómo descargar el archivo con el servicio en android?
  • Android cómo comprobar si el servicio de intenciones sigue funcionando o si ha dejado de funcionar
  • Cómo obtener el contexto en un servicio de intención
  • Android: ¿Cómo obtener el contexto de la actividad de llamadas en un IntentService?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.