2014-08-28 9 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; 

Unregister приемник:

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

Что вы думаете? Почему он работает только при запуске активности и нажатии кнопки в первый раз?

+0

Вы имеете в виду, что пользователь вышел из операции, вернитесь и снова нажмите кнопку? – CChi

+0

@CChi, это работает. Если пользователь существует и возвращается, он работает. Проблема в том, что пользователь остается в действии и хочет нажать кнопку, например, 6 раз, только в первый раз, когда он щелкнет, это сработает. Еще пять раз он ничего не сделает. – user3339562

+1

Do _not_ использовать бесконечный цикл в основном потоке, даже с 'sleep()' кто-то предложил. Вам не нужно постоянно проверять статус переменной. Просто запускайте любой код, «ожидающий» из 'onReceive()', когда он получает трансляцию. –

ответ

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 кажется правильным хотя.

Edit 2:

while(!mStatus){ 
} 

Вы никогда не должны делать это!

+0

Это то же самое. Я думаю, что это не должно быть проблемой, потому что onPause() или onDestroy() вообще не вызывается, потому что пользователь остается в действии и нажимает кнопку. – user3339562

+0

Отредактировал мой ответ; Кстати, приемник просто устанавливает логическое значение в true. Как именно вы знаете, работает ли он? –

+0

У меня есть логический флаг, который устанавливается, когда срабатывает 'onReceive()', и я повсюду помещал регистраторы.В первый раз все регистраторы регистрируют действие, а флаг установлен на значение true. В других случаях вообще не регистрируется, а флаг не установлен. – user3339562

Смежные вопросы