2011-12-22 115 views
0

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

無賴是this won't work on 2.3+

回答

1

我使用的意圖,啓動註冊一個BroadcastReceiver來監聽更改手機狀態

的IntentService

這將無法可靠地工作,因爲一旦IntentService退出,您的過程可能會終止,您的BroadcastReceiver將消失。請將手機狀態BroadcastReceiver放在清單中。

不過,我似乎無法弄清楚如何註銷廣播接收器時,窗口小部件已切換關閉

使用PackageManagersetComponentEnabledSetting()啓用或禁用您在將手機接收狀態表現。

此外,您無法可靠地從BroadcastReceiver以上的任何內容中執行任何操作,如onReceive(),例如註冊事件偵聽器,就像您在此處所做的那樣。

+0

謝謝你指點我正確的方向。我擺脫了動態註冊的接收器,並將其放入清單中,而我使用setComponentEnabledSetting來控制接收器,正如您所建議的那樣。我仍然遇到事件監聽器的一些問題,但是我將它從BroadcastReceiver中移出,我可能會從中找出它。 – Paul