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

20

我正试图注册一个广播接收器,以便在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接收器的状态时,它从未被调用吗?

1个回答

19

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

  1. 在代码中注册(您的情况)
  2. 在AndroidManifest.xml中注册

让我解释一下它们之间的区别。

情况1(在代码中注册广播接收器)

只要您注册接收器的上下文仍然存在,就可以接收广播。 因此,当activityapplication被杀死(取决于您在哪里注册接收器)时,您将不会再收到广播。

我猜您在activity上下文中注册了广播接收器,这不是很好的方法。如果您想为应用程序上下文注册广播接收器,可以尝试以下操作:

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),否则它们将无法传递到您的应用程序。


4
API 9+ 可用。 - Richard Le Mesurier
@steve.mit 我需要为方案1声明权限吗?问题的答案是否适用于任何通过编程方式注册(蓝牙、wifi)的接收器,仅用于开关而不实际访问硬件本身? - Clocker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接