如何在Android Oreo中接收PROVIDERS_CHANGED广播

问题描述 投票:2回答:1

应用程序处理GeoFence需要接收PROVIDERS_CHANGED广播,因为:

  1. 当两个位置提供商(网络和GPS)都关闭时,注册的GeoFences将被删除。
  2. 当打开2个位置提供程序之一时,应用程序需要注册GeoFences才能工作。这应该执行,而不是要求用户再次运行我的应用程序。

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

我可以在应用程序的活动或服务中注册广播接收器,但它迟早会退出(结束其生命周期),然后我需要取消注册它。我的应用程序开始通过GeoFence转换等一些事件开始工作,但接收PROVIDERS_CHANGED对于使其工作至关重要。

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

android-broadcast android-8.0-oreo
1个回答
0
投票

@Tomcat和@ Virat18 - 我遇到了一个解决方案,你不能再在你的清单中注册一个广播接收器来接收Android-OREO中的PROVIDERS_CHANGED动作意图过滤器。 解决方案?只需动态注册你的BroadcastReceiver(从你的代码中),而不是从Manifest注册。而且,你应该使用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。这将继续从后台接收广播,即使用户离开您的活动(按下后退按钮,主页按钮等)。但是,如果用户从多任务按钮关闭您的应用程序,它将不再收到,所以请注意。

© www.soinside.com 2019 - 2024. All rights reserved.