2014-08-28 129 views
1

我有活動,我有EditText供用戶輸入特定數據。用戶寫入一些文本並點擊按鈕後,他正在等待BroadcastReceiver的響應。問題是一切正常,用戶收到迴應,但如果用戶沒有退出活動並再次單擊按鈕,BroadcastReceiver不再發射。如果用戶關閉活動並再次打開它,BroadcastReceiver將再次運行,但僅限於第一次。BroadcastReceiver只觸發一次

這有點令人困惑。這裏是我的代碼:

public void onCreate(Bundle savedInstanceState) { 

    mReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context c, Intent in) { 
      switch (getResultCode()) { 

      case Activity.RESULT_OK: 

       mStatus = true; 
       break; 
      } 
     } 
    }; 

    getActivity().registerReceiver(mReceiver, 
      new IntentFilter(FLAG)); 

} 

當用戶點擊按鈕:

Intent in = new Intent(FLAG); 
PendingIntent pIn = PendingIntent.getBroadcast(context, 1, in, 0); 
SmsManager.getDefault().sendTextMessage("123456789", null, "text", pIn, null); 

while(!mStatus){ 
} 

mStatus = false; 

註銷接收器:

public void onPause() { 
    super.onPause(); 
    getActivity().unregisterReceiver(mReceiver); 
} 

你怎麼想的?爲什麼它只在活動開始並且按鈕被第一次點擊時才起作用?

+0

您的意思是用戶退出該活動,請返回並再次單擊該按鈕? – CChi 2014-08-28 22:17:58

+0

@CChi,這有效。如果用戶存在活動並返回,它就會起作用。問題在於,如果用戶停留在活動中,並且想要點擊按鈕例如6次,則只有當他第一次點擊該按鈕時纔有效。其他五次它不會做任何事情。 – user3339562 2014-08-28 22:19:48

+1

不要在主線程上使用無限循環,即使使用了某人提出的「sleep()」。你不需要經常檢查變量的狀態。只要開始接收廣播時從onReceive()中「等待」的任何代碼即可。 – 2014-08-29 00:13:04

回答

0

試試這個:

public void onPause() { 
    super.onPause(); 
    // getActivity().unregisterReceiver(mReceiver); 
} 

public void onDestroy() { 
    super.onDestroy(); 
    getActivity().unregisterReceiver(mReceiver); 
} 

說明:您應該管理無論是在onCreate()/onDestroy()onResume()/onPause()(相當於生命週期事件)的接收器。

編輯:讓這種變化也(第二行設置flag參數):

Intent in = new Intent(FLAG); 
PendingIntent pIn = PendingIntent.getBroadcast(context, 1, in, PendingIntent.FLAG_UPDATE_CURRENT); 
SmsManager.getDefault().sendTextMessage("123456789", null, "text", pIn, null); 

不知道這是否會修復它,因爲我不知道什麼是0就意味着你使用標誌值。 FLAG_UPDATE_CURRENT似乎是正確的。

編輯2

while(!mStatus){ 
} 

你不應該這樣做!

+0

這是一樣的。我認爲這不應該成爲問題,因爲onPause()或onDestroy()根本不會被調用,因爲用戶停留在活動中並單擊該按鈕。 – user3339562 2014-08-28 22:31:53

+0

編輯我的答案;順便說一下,接收器只是將布爾值設置爲true。你究竟怎麼知道它是否運行? – 2014-08-28 22:53:06

+0

我有一個布爾標誌,當'onReceive()'觸發時我設置了一個布爾標誌,並且我把記錄器放在了任何地方。所有記錄器首次記錄動作並將標誌設置爲true。其他時間根本沒有記錄和標記未設置。 – user3339562 2014-08-28 23:22:13