2012-03-28 98 views
0

我做一個BrodcastReceiver來說話:接聽電話,而電話鈴聲。廣播接收器的BroadcastReceiver不會停止線程

守則:

@Override 
public void onReceive(Context context, Intent intent) { 

    cont = context; 
    tts = new Speak(cont); 

    String action = intent.getAction(); 
    if (action.equalsIgnoreCase("android.intent.action.PHONE_STATE")) { 
     if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
       TelephonyManager.EXTRA_STATE_RINGING)) { 

      incoming_number = intent.getExtras().getString(
        "incoming_number"); 

      falador = new Thread() { 
       @Override 
       public void run() { 
        try { 
         if (!this.isInterrupted()) { 
          while (true) { 
           sleep(5000); 
           h.post(repeater); 
          } 
         } 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      }; 
      falador.start(); 

     } else { 
      if (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals(
        TelephonyManager.EXTRA_STATE_IDLE)) { 

       h.removeCallbacks(repeater); 
       falador.interrupt(); 
      } 
     } 
    } 
} 

但是,事件IDLE不會停止線程。你可以幫我嗎?

感謝, 馬特烏斯

+0

你確定你的線程在中斷之前運行嗎?也許它根本沒有運行。做一些日誌記錄,看看這個 – waqaslam 2012-03-28 12:41:48

回答

0

你可以使用:

 falador = new Thread() { 
      @Override 
      public void run() { 
       try { 
        while (!Thread.interrupted()) { 
         sleep(5000); 
         h.post(repeater); 
        }       
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
    }; 

然後,當你打斷它會停止線程

+0

: - {不適合我。我嘗試使用計劃任務計時器... – Mateus 2012-03-28 19:53:33

0

這個問題是舊的,但需要一個答案。 BroadcastReceiver運行在應用程序的主線程上,onReceive方法的生命週期非常短。你可以認爲,Android系統的創建和運行,並破壞了後臺類型這個接收器的對象:

BroadcastReceiver receiver = new YourReceiver(); 
receiver.onReceive(context, intent); 
System.gc(); 

後該方法完成,相關對象(接收器)變得容易受到垃圾收集。這意味着創建/開始/連接到該接收器的任何東西都可以被系統立即殺死。所以你不應該(實際上不能)在onReceive方法中做任何異步操作。 Receiver LifecyleonReceive(context, intent)強調這種情況。