2012-07-30 58 views
2

我想下面的融入我的代碼註銷phonestatelistener無法註銷phonestatelistener

TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); 
if(mgr != null) { 
    mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); 
} 

我有在後臺運行,並檢查是否有號碼是阻止列表上的服務。如果是的話那麼它調用PhonestateListener

TelephonyManager mTM = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE); 
mTM.listen(new phoneStateListener(NumberInbound,Msg_to_display,mTM), PhoneStateListener.LISTEN_CALL_STATE); 

但是當我從阻止列表中刪除了一些我想註銷phonestatelistner。相反,發生的是phonestatelistener總是被註冊,我以前刪除的msisdn仍然被阻止!

你能幫忙嗎?

代碼phonestatelistner

class phoneStateListener extends PhoneStateListener { 

    String inbounda; 
    int MessagetoDisplay; 
    String msg; 
    String reply; 
    TelephonyManager myt; 
    MyService calltoService; 
    boolean mBound = false; 
    private static final String TAG = "PHONELISTENER"; 

    phoneStateListener(String inbound,int Message,TelephonyManager t) { 
     inbounda = inbound; 
     MessagetoDisplay = Message; 
     myt = t; 
    } 

    public void onCallStateChanged(int state, String incomingNumber) { 

     if(!incomingNumber.equals(inbounda)){ 

     } else { 

      final String TAG = "Phone call"; 
      ITelephony telephonyService; 
     //new code 
      Log.v("Phone State", "state:"+state); 

      switch (state) { 
       case TelephonyManager.CALL_STATE_IDLE: 
        Log.v("Phone State", "incomingNumber:"+incomingNumber+" ended"); 
        break; 
       case TelephonyManager.CALL_STATE_OFFHOOK: 
        Log.v("Phone State", "incomingNumber:"+incomingNumber+" picked up"); 
        break; 
       case TelephonyManager.CALL_STATE_RINGING: 
        if(inbounda.equalsIgnoreCase(incomingNumber)){ 
         Log.v("ARE THE SAME...............................", "incomingNumber:"+incomingNumber+ "inbound:"+ inbounda + "MSG TO DISPLAY" +msg); 

         try{ 
          Class c = Class.forName(myt.getClass().getName()); 
          Method m = c.getDeclaredMethod("getITelephony"); 
          m.setAccessible(true); 
          telephonyService = (ITelephony) m.invoke(myt); 
          telephonyService.silenceRinger(); 
          telephonyService.endCall(); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 

         try{ 
          Thread.currentThread().sleep(4000); 
          replyChecker(MessagetoDisplay); 
         } catch(InterruptedException ie){ 

         } 
        } 
        break; 
       default: 
        break; 
      } 
     } 
    } 

    public String replyChecker(int Check) { 
     SmsManager mySMS = SmsManager.getDefault(); 
     String destination = inbounda;  
     //open - to be extended to allow user to define own tailored message 
     String Meeting = "Sorry I am at a meeting. Graham "; 
     String Gym = "I am currently at the gym and will respond to you later. Graham "; 
     String NewYearsEve = "Happy New Year to you and your loved ones. Graham "; 

     if(Check == 1) { 
      Log.v("HERE NOW1",":"); 
      reply = Meeting; 

      mySMS.sendTextMessage(destination, null, Meeting, null, null); 
      return reply; 
     } else if (Check == 2) { 
      Log.v("HERE NOW2",":"); 
      reply = Gym; 
      mySMS.sendTextMessage(destination, null, Gym, null, null); 
      return reply; 
     } else if (Check == 3) { 
      Log.v("HERE NOW3",":"); 
      reply = NewYearsEve; 
      mySMS.sendTextMessage(destination, null, NewYearsEve, null, null); 
      return reply; 
     } 
     // TODO Auto-generated method stub 
     return reply; 
    } 
} 
+0

任何想法?看起來像phonestatelistener總是在聽我不能註銷它 – 2012-07-30 10:19:40

+0

你是什麼意思「程序狀態丟失」,這聽起來不像Wakelocks任何事情? – Blundell 2012-10-16 21:19:22

+0

謝謝布倫德爾回答。我對程序狀態丟失並且編輯了我的問題不正確。我的意思是說下面的內容,當我有一個具有多個活動和一個服務的應用程序,並且當我在這些活動(或電話睡眠)之間導航時,狀態信息,即存儲的散列數據不再被引用。我讀過wakelocks或WindowsManager在這種情況下可以提供幫助,但我不清楚在這裏繼續的正確方法是什麼。再次感謝 – 2012-10-17 07:42:28

回答

1

其實,我通過在服務中實現廣播接收機來解決這個問題。我遇到的問題不是與PowerManager有關,而是服務沒有監聽來電。

廣播接收器監聽android.intent.action.PHONE_STATE完成工作

由於格雷厄姆

1

我有多個活動,在我的申請,我需要一種方法來保持狀態的情況下手機進入待機模式和活動之間nativating。

手機不會進入待機狀態,而用戶使用你的應用程序,絕對不是在活動之間,假設任何類似隱約一個正常的應用程序流。設備只會在非活動狀態後纔會入睡,而當用戶點擊某件事物從一種活動轉移到下一種活動時,不活動計時器會重置。

如果要保持清醒的設備,而有些活動是在屏幕上,在某些View使用android:keepScreenOnsetKeepScreenOn(),這樣你就不會用自己的WakeLock有亂。