19

我正在尝试注册广播接收器以在 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 接收器吗?

4

1 回答 1

19

在 Android 中有两种注册广播接收器的方法:

  1. 在代码中(你的情况)
  2. 在 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>

编辑: 一些特殊的广播(即 SCREEN_ON 或 SCREEN_OFF)必须在代码中注册(案例 1),否则它们将不会传送到您的应用程序。

于 2013-10-21T15:04:19.223 回答