2014-08-28 3 views
1

J'ai une activité où j'ai EditText pour l'utilisateur d'entrer certaines données. Après que l'utilisateur a écrit du texte et clique sur le bouton, il attend une réponse de BroadcastReceiver. Le problème est que tout fonctionne pour la première fois et que l'utilisateur reçoit une réponse, mais si l'utilisateur ne quitte pas l'activité et clique à nouveau sur le bouton, BroadcastReceiver ne se déclenche plus. Si l'utilisateur ferme l'activité et l'ouvre à nouveau, BroadcastReceiver fonctionne de nouveau mais seulement pour la première fois.BroadcastReceiver se déclenche une seule fois

Ceci est un peu déroutant. Voici mon code:

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)); 

} 

lorsque l'utilisateur clique bouton:

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; 

récepteur Désenregistrer:

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

Que pensez-vous? Pourquoi cela ne fonctionne que lorsque l'activité est démarrée et que le bouton est cliqué pour la première fois?

+0

Voulez-vous dire que l'utilisateur quitte l'activité, revenez et cliquez à nouveau sur le bouton? – CChi

+0

@CChi, cela fonctionne. Si l'utilisateur existe et revient, cela fonctionne. Le problème est que si l'utilisateur reste en activité et veut cliquer sur le bouton par exemple 6 fois, seulement la première fois qu'il a cliqué, cela fonctionnera. Autre cinq fois, il ne fera rien. – user3339562

+1

Est-ce que _not_ n'utilise pas une boucle infinie sur le thread principal, même avec le 'sleep()' suggéré par quelqu'un. Vous n'avez pas besoin de vérifier constamment l'état de la variable. Il suffit de démarrer le code attendu de "onReceive()" quand il reçoit la diffusion. –

Répondre

0

Essayez ceci:

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

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

Explication: vous devez gérer le récepteur soit en onCreate()/ou onDestroy()onResume()/onPause() (événements du cycle de vie correspondant).

Modifier: faire ce changement aussi (deuxième ligne définit l'argument 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); 

Je ne sais pas si cela va résoudre parce que je ne sais pas ce que le 0 signifie que vous utilisiez pour la valeur du drapeau. FLAG_UPDATE_CURRENT semble correct cependant.

Edit 2:

while(!mStatus){ 
} 

Vous ne devriez jamais faire ça!

+0

C'est pareil. Je pense que cela ne devrait pas être un problème parce que onPause() ou onDestroy() n'est pas appelé du tout parce que l'utilisateur reste en activité et en cliquant sur le bouton. – user3339562

+0

Édité ma réponse; En passant, le récepteur définit simplement un booléen à vrai. Comment savez-vous si cela fonctionne? –

+0

J'ai un drapeau booléen qui est défini quand 'onReceive()' se déclenche et j'ai mis des enregistreurs partout.La première fois, tous les enregistreurs enregistrent l'action et l'indicateur est défini sur true. D'autres fois, aucune journalisation et aucun drapeau n'est défini. – user3339562

Questions connexes