如何在Android Oreo中接收PROVIDERS_CHANGED广播

时间:2018-08-28 13:49:20

标签: android-broadcast android-8.0-oreo

由于以下原因,处理GeoFence的应用需要接收PROVIDERS_CHANGED广播

  1. 两个位置提供商都将删除已注册的地理围栏 (网络和GPS)已关闭。
  2. 打开2个位置提供者之一后,应用需要注册 GeoFences工作。这应该在不要求用户运行的情况下执行 再次访问我的应用。

所以我的应用程序一直在清单中注册其广播接收器。但由于PROVIDERS_CHANGED并不是我们可以像以前那样使用的软件,因此它在Android Oreo中不再起作用。

我可以在应用程序的活动或服务中注册广播接收器,但它迟早会退出(终止其生命周期),然后我需要注销它。我的应用程序开始通过诸如GeoFence过渡之类的事件开始工作,但是接收PROVIDERS_CHANGED对于使其工作至关重要。

我验证了PROVIDERS_CHANGED不能被注册在Android Oreo清单中的接收者接收。有什么解决办法吗?

1 个答案:

答案 0 :(得分:0)

@Tomcat和@ Virat18-我遇到了一个解决方案,您不再可以在清单中注册广播接收器,以在Android-OREO中接收PROVIDERS_CHANGED操作Intent过滤器。 br />
解决方案?只需动态(从代码内)而不是从清单中注册BroadcastReceiver即可。此外,不要检查硬编码的正则表达式android.location.PROVIDERS_CHANGED,而应使用LocationManager.PROVIDERS_CHANGED_ACTION(和当然要导入LocationManager)。

以下是我用来使其正常工作的代码示例! (例如:通过单击按钮):

public void buttonClick(View view) {

    IntentFilter filter = new IntentFilter();
    filter.addAction("android.location.PROVIDERS_CHANGED");

    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().matches(LocationManager.PROVIDERS_CHANGED_ACTION)) {
                Log.i(TAG, "Action MATCHES LocationManager.PROVIDERS_CHANGED_ACTION!");
            }
        }
    };

    this.getApplicationContext().registerReceiver(receiver, filter);
    Log.i(TAG, "RECEIVER HAS BEEN REGISTERED");

}

此外,不要忘记在代码中正确地注销接收者。

如果您认为这是一个很好的解决方案,请接受它作为答案
快乐编码!

PS。即使用户离开您的活动(按下后退按钮,主页按钮等),它仍将继续从后台接收广播。但是,如果用户从“多任务”按钮关闭了您的应用程序,它将不再接收,因此请注意。