[英]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 ...
我正在使用一个意图来启动一个IntentService来注册一个BroadcastReceiver来侦听电话状态的变化
这将无法可靠地运行,因为一旦退出IntentService
,您的进程可能会终止,并且BroadcastReceiver
将消失。 请在清单中放入电话状态BroadcastReceiver
。
但是,我似乎无法弄清楚在关闭小部件后如何注销BroadcastReceiver
使用PackageManager
和setComponentEnabledSetting()
启用或禁用放置在清单中的电话状态接收器。
同样,您无法像在此那样,可靠地通过存在于onReceive()
的BroadcastReceiver
进行任何操作,例如注册事件侦听器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.