我是Android開發新手。我正在嘗試開發一個按鈕,用於切換設備是否自動接聽來電。在IntentService中取消註冊BroadcastReceiver
我開始創建一個擴展AppWidgetProvider的類。我使用SharedPreferences來存儲小部件按鈕的狀態。在OnReceive(Context,Intent)方法中,我使用一個intent來啓動一個IntentService,它註冊一個BroadcastReceiver來偵聽電話狀態的變化。但是,我似乎無法弄清楚如何在小部件切換後取消註冊BroadcastReceiver--無論widget按鈕的狀態如何,我的代碼都會繼續監視手機狀態。可能嗎?或者有另一種方法可以阻止PhoneStateListener?
謝謝。
UPDATE:這裏是修訂代碼
清單:我把廣播接收器與android.intent.action.PHONE_STATE意圖過濾器清單中的
在的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 ...
謝謝你指點我正確的方向。我擺脫了動態註冊的接收器,並將其放入清單中,而我使用setComponentEnabledSetting來控制接收器,正如您所建議的那樣。我仍然遇到事件監聽器的一些問題,但是我將它從BroadcastReceiver中移出,我可能會從中找出它。 – Paul