Gps статус включен/отключен широковещательный приемник - программирование
Подтвердить что ты не робот

Gps статус включен/отключен широковещательный приемник

Я пытаюсь зарегистрировать широковещательный приемник для получения обновлений при изменении состояния gps.

Однако мой GpsChangeReceiver onReceive метод, похоже, не вызывается, когда статус gps изменяется с включенного на отключенный или наоборот.

Прежде всего, я регистрирую получателя:

      GpsChangeReceiver m_gpsChangeReceiver = new GpsChangeReceiver();
      this.registerReceiver(m_gpsChangeReceiver, new IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION));

Затем у меня есть 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
         }
  }
}

Наконец, мой манифест содержит:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Может ли кто-нибудь понять, почему gps-приемник никогда не вызывается, когда я изменяю его статус из настроек телефона?

4b9b3361

Ответ 1

два способа регистрировать широковещательные приемники в Android:

  • в коде (ваш случай)
  • в AndroidManifest.xml

Позвольте мне объяснить различия.

Случай 1 (широковещательный приемник, зарегистрированный в коде)

Вы будете получать только широковещательные сообщения, если контекст, где вы зарегистрировали ваш ресивер, в живом. Поэтому, когда активность или приложение убито (в зависимости от того, где вы зарегистрировали ваш ресивер), вы больше не будете получать.

Я предполагаю, что вы зарегистрировали широковещательный приемник в контексте активности, который не очень хороший подход. Если вы хотите зарегистрировать широковещательный приемник для своего контекста приложения, вы можете сделать что-то вроде этого:

getApplicationContext().registerReceiver(m_gpsChangeReceiver, new IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION));

Случай 2 (широковещательный приемник, зарегистрированный в AndroidManifest.xml)

Вы будете получать трансляции, даже если ваше приложение убито (система запустит ваше приложение). Это правильный подход, когда вы хотите получать трансляции независимо от того,, если ваше приложение работает.

Добавьте этот ресивер в свой AndroidManifest.xml:

<receiver android:name="com.yourpackage.NameOfYourBroadcastReceiver">
  <intent-filter>
    <action android:name="android.location.PROVIDERS_CHANGED" />
  </intent-filter>
</receiver>

EDIT: Некоторые специальные трансляции (т.е. SCREEN_ON или SCREEN_OFF) должны быть зарегистрированы в коде (случай 1), иначе они не будут доставлены в ваше приложение.