启用和禁用广播接收器

我尝试使用此PackageManager方法启用和禁用广播接收器:


setComponentEnabledSetting(componentName,

        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,

        PackageManager.DONT_KILL_APP);

广播接收器已注册在清单中。接收器工作正常,但是当我尝试禁用它时,它仍然会接收广播消息。当我通过“ android:enabled =“ false”“禁用清单中的接收器时,接收器未收到任何内容,但我无法启用它。


我从服务内部调用该方法。


    PackageManager pm  = getApplicationContext().getPackageManager();

    ComponentName componentName = new ComponentName("com.app",

             ".broadcast_receivers.OnNetworkChangedReceiver");

    pm.setComponentEnabledSetting(componentName,

            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,

            PackageManager.DONT_KILL_APP);

Android清单:


    <receiver android:name=".broadcast_receivers.OnNetworkChangedReceiver"

                android:enabled="true">

            <intent-filter>

                    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>

            </intent-filter>

    </receiver>

收件人


public class OnNetworkChangedReceiver extends BroadcastReceiver {

private static final String TAG = "OnNetworkChangedReceiver";


@Override

public void onReceive(Context context, Intent intent) {

    Log.d(TAG, "in OnNetworkChanged");

    }

}

我昨天也从一个Activity内部调用了该方法。我以为它有用,但是今天什么也没有了。可能是我昨天误解为禁用接收器的意图(android.net.conn.CONNECTIVITY_CHANGE)有时会有很大的延迟吗?


PackageManager的方法是正确的方向还是该想法存在基本错误?


非常感谢,Sven


沧海一幻觉
浏览 585回答 3
3回答

湖上湖

我认为使用PackageManager会过度考虑您的情况。您有一个BroadcastReceiver,有时需要忽略它正在收听的广播。我可以想到两种简单的方法:1)设置一个标志,您的接收者可以检查该标志以忽略或接受广播,而不必担心完全启用/禁用它。2)以编程方式(甚至可以是一个内部类)创建BroadcastReceiver,并在应用程序的给定部分根据需要注册和注销它。总的来说,我发现用代码而不是XML定义我的BroadcastReceivers可以提供更大的灵活性,并且通常更易于管理。

米琪卡哇伊

某些类型的广播(例如BOOT_COMPLETED)无法通过进行有效注册registerReceiver()。而且,过度依赖registerReceiver()会导致您获得永久服务-仅用于维护接收方的服务-这很糟糕。禁用组件是提高效率的一个好主意,尤其是对于流行的系统广播(例如)BOOT_COMPLETED。
打开App,查看更多内容
随时随地看视频慕课网APP