我是 Android 开发的新手。我正在尝试开发一个带有按钮的小部件,该按钮可以切换设备是否自动接听来电。
我首先创建了一个扩展 AppWidgetProvider 的类。我正在使用 SharedPreferences 来存储小部件按钮的状态。在 OnReceive(Context, Intent) 方法中,我使用一个意图来启动一个 IntentService,该服务注册一个 BroadcastReceiver 以监听电话状态的变化。但是,当小部件被关闭时,我似乎无法弄清楚如何取消注册 BroadcastReceiver - 无论小部件按钮的状态如何,我的代码都会继续监视手机状态。可能吗?还是有另一种方法可以停止PhoneStateListener?
谢谢。
更新:这是对代码的修订
清单:我将带有 android.intent.action.PHONE_STATE 意图过滤器的 BroadcastReceiver 放在清单中
在 AppWidgetProvider 中:
ComponentName componentName = new ComponentName(context, PhoneStateBroadcastReceiver.class);
//use to enable the broadcast receiver
packageManager.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
//use to disable the broadcast receiver
packageManager.setComponentEnabledSetting(componentName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
在广播接收器中:
@Override
public void onReceive(Context context, Intent intent) {
//check call state
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
if(tm.getCallState()==TelephonyManager.CALL_STATE_RINGING){
try{
//wait 2 seconds then answer the call
Thread.sleep(2000);
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
ITelephony telephony = (ITelephony)m.invoke(tm);
telephony.silenceRinger();
telephony.answerRingingCall();
} catch(Exception e){}
}
}
不需要PhoneStateListener ...
可惜这在2.3+上不起作用