Android Gps状态启用/禁用广播接收器

Android Gps状态启用/禁用广播接收器,android,Android,我正在尝试注册一个广播接收器,以便在gps状态更改时接收更新 但是,当gps状态从enabled(启用)更改为disabled(禁用)或反之亦然时,似乎不会调用我的GpsChangeReceiver onReceive方法 首先,我正在注册接收者: GpsChangeReceiver m_gpsChangeReceiver = new GpsChangeReceiver(); this.registerReceiver(m_gpsChangeReceiver, new IntentFilter(

我正在尝试注册一个广播接收器,以便在gps状态更改时接收更新

但是,当gps状态从enabled(启用)更改为disabled(禁用)或反之亦然时,似乎不会调用我的GpsChangeReceiver onReceive方法

首先,我正在注册接收者:

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接收器的状态时,gps接收器从未被调用吗?

在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>
    
    
    
    编辑:
    某些特殊广播(即屏幕打开或屏幕关闭)必须在代码中注册(案例1),否则它们将不会发送到您的应用程序。

    可从API 9+@steve.mit获得。我需要声明案例1的许可吗?该问题的答案是否适用于仅为开/关而编程注册(蓝牙、wifi)的任何接收器,而不是实际访问硬件本身?