我试图为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它正在运行,但它会关闭应用。
提前致谢。
答案 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