禁用广播接收器

时间:2015-03-13 09:19:26

标签: android broadcastreceiver

我试图为PhoneStateListener添加一个广播接收器。我在清单中宣布接收者,

<receiver
        android:name="my.pckname.receiver.IncomingCallReceiver"
        android:enabled="false" >
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
        </intent-filter>
    </receiver>

我正在尝试使用CheckBoxPreference通过首选项屏幕启用和禁用接收器。

<PreferenceCategory android:title="Title here" >
    <CheckBoxPreference
        android:key="allow_calls_from_circle"
        android:summary="Summary here"
        android:title="This a title" />

    <EditTextPreference
        android:dialogTitle="Title here"
        android:key="default_sms_body"
        android:summary="Summary here"
        android:title="Title here"
        android:dependency="allow_calls_from_circle" 
       />
</PreferenceCategory>

但是,我能够启用它,它工作正常!如果我尝试禁用它,它仍然会收到广播消息。这是我的代码。

public class Settings extends SherlockPreferenceActivity implements
 OnPreferenceClickListener {

private static final String TAG = Settings.class.getSimpleName();

CheckBoxPreference allowCallsFromCircle;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // deprecated no replacement API level below 13
    addPreferencesFromResource(R.xml.settings);

    allowCallsFromCircle = (CheckBoxPreference) findPreference("allow_calls_from_circle");
    allowCallsFromCircle.setOnPreferenceClickListener(this);
}


@Override
public boolean onPreferenceClick(Preference preference) {
    Log.d(TAG, "onPreferenceClick");

    ComponentName component = new ComponentName(getBaseContext(),
            IncomingCallReceiver.class);
    int status = getPackageManager().getComponentEnabledSetting(component);
    Log.d(TAG, "status" + status);

    if ((status == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT && allowCallsFromCircle
            .isChecked())
            || (status == PackageManager.COMPONENT_ENABLED_STATE_DISABLED && allowCallsFromCircle
                    .isChecked())) {
        getPackageManager().setComponentEnabledSetting(component,
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);
        Log.d(TAG, "enabled");

    } else if (status == PackageManager.COMPONENT_ENABLED_STATE_ENABLED
            && !allowCallsFromCircle.isChecked()) {
        getPackageManager().setComponentEnabledSetting(component,
                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
                PackageManager.DONT_KILL_APP);
        Log.d(TAG, "disabled");
    }
    return true;
}}

注意:在发布此问题之前,我尝试过类似的解决方案 this one here,但它对我没用。

编辑:如果我使用0而不是PackageManager.DONT_KILL_APP它正在运行,但它会关闭应用。



提前致谢。

2 个答案:

答案 0 :(得分:0)

我认为你的错误在于接收者创建 - 类名应该是&#34;实现组件的pkg内部类的名称。&#34;。因此,在您的情况下,它必须只是".IncomingCallReceiver"

我通常在此方法上使用另一种形式,将类传递给它 - http://developer.android.com/reference/android/content/ComponentName.html#ComponentName%28android.content.Context,%20java.lang.Class%3C?%3E%29

答案 1 :(得分:0)

我的解决方案是在java代码中注册并取消注册侦听器IncomingCallReceiver。 Receiver可以通过Android清单文件注册。您还可以通过Context.registerReceiver()和Context.unregisterReceiver()方法在运行时注册和取消注册接收器。 您可以在here

中查看示例