启用和禁用广播接收器

时间:2011-04-11 16:30:32

标签: android broadcastreceiver

我尝试使用此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的方法是正确的方向还是想法中存在基本错误?

非常感谢, 斯文

2 个答案:

答案 0 :(得分:73)

嗯,你基本上拥有的东西似乎没问题。我在one of my projects中有以下代码:

boolean enabled=prefs.getBoolean(key, false);
int flag=(enabled ?
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED :
            PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
ComponentName component=new ComponentName(EditPreferences.this, OnBootReceiver.class);

getPackageManager()
    .setComponentEnabledSetting(component, flag,
                                PackageManager.DONT_KILL_APP);

当我没有需要安排的任何活动警报时,我用它来禁用BOOT_COMPLETED接收器。

我猜您的ComponentName未正确设置(例如,您的领先.)。试试我正在使用的构造函数,它将ContextClass作为参数。

答案 1 :(得分:4)

我认为使用PackageManager会过度考虑你的情况。你有一个BroadcastReceiver,有时候需要忽略它正在监听的广播。我可以想出两个简单的方法来解决这个问题:

1)设置一个接收器可以检查忽略或接受广播的标志,并且不用担心启用/禁用它。

2)以编程方式创建BroadcastReceiver(甚至可以是内部类),并在应用程序的给定部分根据需要注册和注销它。

总的来说,我发现用代码而不是XML定义我的BroadcastReceivers提供了更多的灵活性,通常我更容易管理。