0

我是 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+上不起作用

4

1 回答 1

1

我正在使用一个意图来启动一个 IntentService,它注册一个 BroadcastReceiver 来监听电话状态的变化

这将无法可靠地工作,因为一旦IntentService退出,您的流程可能会终止并且您的BroadcastReceiver意愿会消失。请将电话状态BroadcastReceiver放入您的清单中。

但是,当小部件已关闭时,我似乎无法弄清楚如何取消注册 BroadcastReceiver

使用PackageManagersetComponentEnabledSetting()启用或禁用您放置在清单中的电话状态接收器。

此外,您无法可靠地从BroadcastReceiver过去的 a 中执行任何操作onReceive(),例如注册事件侦听器,就像您在此处所做的那样。

于 2011-12-22T21:11:41.143 回答