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

时间:2012-09-30 22:09:22

标签: android

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

但是,当gps状态从启用更改为禁用时,似乎不会调用我的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接收器?

1 个答案:

答案 0 :(得分:16)

在Android中注册广播接收器有两种方式

    代码中的
  1. (您的情况)
  2. AndroidManifest.xml中的
  3. 让我解释一下差异。

    案例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>
    

    修改 某些特殊广播(即SCREEN_ON或SCREEN_OFF)必须在代码(案例1)中注册,否则它们将无法发送到您的应用程序。