繁体   English   中英

在IntentService中注销BroadcastReceiver

[英]Unregister BroadcastReceiver in IntentService

我是Android开发的新手。 我正在尝试开发带有按钮的小部件,该按钮可切换设备是否自动接听来电。

我首先创建了一个扩展AppWidgetProvider的类。 我正在使用SharedPreferences存储小部件按钮的状态。 在OnReceive(Context,Intent)方法中,我正在使用一种意图来启动一个IntentService,该服务注册一个BroadcastReceiver来侦听电话状态的更改。 但是,我似乎无法弄清楚在关闭小部件后如何注销BroadcastReceiver的方法-无论小部件按钮的状态如何,我的代码都将继续监视电话状态。 可能吗? 还是有其他方法可以停止PhoneStateListener?

谢谢。

更新 :这是对代码的修订

清单:我将带有android.intent.action.PHONE_STATE intent-filter的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);

在BroadcastReceiver中:

@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+

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

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

但是,我似乎无法弄清楚在关闭小部件后如何注销BroadcastReceiver

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

同样,您无法像在此那样,可靠地通过存在于onReceive()BroadcastReceiver进行任何操作,例如注册事件侦听器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM