pie - android sistema operativo
Estado de GPS habilitado/deshabilitado receptor de difusión (1)
Estoy tratando de registrar un receptor de difusión para recibir actualizaciones cuando se cambia el estado de GPS.
Sin embargo, no parece que se llame a mi método GpsChangeReceiver onReceive cuando se cambia el estado de gps de habilitado a deshabilitado o viceversa.
En primer lugar, estoy registrando al receptor:
GpsChangeReceiver m_gpsChangeReceiver = new GpsChangeReceiver();
this.registerReceiver(m_gpsChangeReceiver, new IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION));
Entonces, tengo mi receptor GPS
public class GpsChangeReceiver extends BroadcastReceiver
{
@Override
public void onReceive( Context context, Intent intent )
{
final LocationManager manager = (LocationManager) context.getSystemService( Context.LOCATION_SERVICE );
if (manager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
//do something
}
else
{
//do something else
}
}
}
Finalmente, mi manifiesto contiene:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
¿Alguien puede ver por qué nunca se llama al receptor gps cuando modifico su estado desde la configuración del teléfono?
Hay dos formas de registrar receptores de transmisión en Android:
- en el código (su caso)
- en AndroidManifest.xml
Déjame explicarte las diferencias.
Caso 1 (Broadcast Receiver registrado en el código)
Solo recibirá transmisiones mientras esté vivo el contexto en el que registró su receptor. Por lo tanto, cuando se elimina la actividad o la aplicación (dependiendo de dónde haya registrado su receptor) , ya no recibirá más transmisiones.
Supongo que ha registrado un receptor de transmisión en el contexto de la actividad, lo que no es un buen enfoque. Si desea registrar un receptor de difusión para el contexto de su aplicación , puede hacer algo como esto:
getApplicationContext().registerReceiver(m_gpsChangeReceiver, new IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION));
Caso 2 (Broadcast Receiver registrado en AndroidManifest.xml)
Recibirá transmisiones incluso cuando su aplicación sea cancelada (el sistema activará su aplicación ). Este es el enfoque correcto cuando desea recibir transmisiones sin importar si su aplicación se está ejecutando .
Agrega este receptor a tu AndroidManifest.xml:
<receiver android:name="com.yourpackage.NameOfYourBroadcastReceiver">
<intent-filter>
<action android:name="android.location.PROVIDERS_CHANGED" />
</intent-filter>
</receiver>
EDITAR: Algunas transmisiones especiales (es decir, SCREEN_ON o SCREEN_OFF) deben registrarse en el código (caso 1), de lo contrario no se enviarán a su aplicación.