【问题标题】:Unregister BroadcastReceiver in IntentService在 IntentService 中注销 BroadcastReceiver
【发布时间】:2011-12-22 19:35:16
【问题描述】:

我是 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...

真烦this won't work on 2.3+

【问题讨论】:

    标签: android broadcastreceiver intentservice


    【解决方案1】:

    我正在使用一个 IntentService 来启动一个注册 BroadcastReceiver 以监听手机状态变化的 IntentService

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

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

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

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

    【讨论】:

    • 感谢您为我指明了正确的方向。我摆脱了动态注册的接收器并将其放入清单中,并且按照您的建议,我使用 setComponentEnabledSetting 来控制接收器。我的事件侦听器仍然存在一些问题,但我将其移出 BroadcastReceiver 并且我可能能够从那里解决。
    猜你喜欢
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    相关资源
    最近更新 更多