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:
- El oyente de ubicación funciona desde un servicio pero no es un servicio de IntentService
- Servicios Roboeléctricos y de Intención
- Suscripción o vinculación a un servicio de Intent existente
- Java.lang.RuntimeException no puede instanciar servicio: java.lang.NullPointerException
- Android: El servicio de intento anidado no se inicia después de llamar a Context.startService ()
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" /> ...
- Intentservice no hay constructor vacío, pero hay un constructor
- ¿Cuándo anular el registro de BroadcastReceiver? En onPause (), onDestroy (), o onStop ()?
- Android, Mostrar alertaDialog en lugar de notificación cuando la aplicación está abierta
- Cómo comprobar si se inició IntentService
- ¿Es seguro el método onStartCommand (...) de IntentService?
- La notificación creada por IntentService utiliza siempre una intención incorrecta
- No Serializable Excepción en clase personalizada - Android
- Deteniendo un IntentService
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.
- Invocación de método puede producir java NullpointerException
- Cómo consultar el valor de la columna que se establece como puntero a otra tabla en Parse