web-dev-qa-db-fra.com

Android BroadcastReceiver dans Activity

Je suis juste en train d'essayer ce petit exemple de projet, tout ce qu'il fait: La première activité a un bouton qui envoie une diffusion. L'activité deux affiche un toast à la réception. Vous trouverez ci-dessous le code, la diffusion n’est jamais reçue. Qu'est-ce que je fais mal?

Envoi de la diffusion

public class SendBroadcast extends Activity {

    public static String BROADCAST_ACTION = "com.unitedcoders.Android.broadcasttest.SHOWTOAST";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public void sendBroadcast(View v){
        Intent broadcast = new Intent();
        broadcast.setAction(BROADCAST_ACTION);
        sendBroadcast(broadcast);
    }
}

le recevant

public class ToastDisplay extends Activity {

    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT);
        }
    };

    @Override
    protected void onResume() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(SendBroadcast.BROADCAST_ACTION);
        registerReceiver(receiver, filter);
        super.onResume();
    }

    @Override
    protected void onPause() {
        unregisterReceiver(receiver);
        super.onPause();
    }
}

Manifeste

<application Android:icon="@drawable/icon" Android:label="@string/app_name">
    <activity Android:name=".SendBroadcast" Android:label="@string/app_name">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />
            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity Android:name=".ToastDisplay">
        <intent-filter>
            <action Android:name="com.unitedcoders.Android.broadcasttest.SHOWTOAST"></action>
        </intent-filter>
    </activity>
</application>
46
nheid

Qu'est-ce que je fais mal?

Le code source de ToastDisplay est correct (le mien est similaire et fonctionne), mais il ne recevra que quelque chose s'il est actuellement au premier plan (vous enregistrez le destinataire dans onResume). Mais il ne peut rien recevoir si une activité différente (dans ce cas l'activité SendBroadcast) est affichée.

Au lieu de cela, vous voudrez probablement startActivity ToastDisplay à partir de la première activité?

BroadcastReceiver et Activity ont un sens dans un cas d'utilisation différent. Dans mon application Je dois recevoir des notifications d'un service de suivi GPS en arrière-plan et les afficher dans l'activité (si l'activité est au premier plan ).

Il n'est pas nécessaire de inscrire le destinataire dans le manifeste. Ce serait même nuisible dans mon cas d'utilisation - mon récepteur manipule l'interface utilisateur de l'activité et l'interface ne le ferait pas être disponible pendant onReceive si l'activité n'est pas affichée actuellement. Au lieu de cela, j'enregistre et désenregistre le récepteur pour une activité dans onResume et onPause comme décrit dans documentation BroadcastReceiver :

Vous pouvez soit enregistrer dynamiquement une instance de cette classe avec Context.registerReceiver (), soit publier de manière statique une implémentation via la balise de votre fichier AndroidManifest.xml.

40
geekQ
 Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT);

fait le pain grillé, mais ne le montre pas.

Vous devez faire Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT).show();

38
rfsk2010

Etend la classe ToastDisplay avec BroadcastReceiver et enregistre le destinataire dans le fichier manifeste, sans enregistrer votre récepteur de diffusion dans onResume ().

<application
  ....
  <receiver Android:name=".ToastDisplay">
    <intent-filter>
      <action Android:name="com.unitedcoders.Android.broadcasttest.SHOWTOAST"/>
    </intent-filter>
  </receiver>
</application>

si vous souhaitez vous inscrire à l'activité, inscrivez-vous à la méthode onCreate (), par exemple:

onCreate(){

    sentSmsBroadcastCome = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "SMS SENT!!", Toast.LENGTH_SHORT).show();
        }
    };
    IntentFilter filterSend = new IntentFilter();
    filterSend.addAction("m.sent");
    registerReceiver(sentSmsBroadcastCome, filterSend);
}
5
Tushar Bapte

Vous devez définir le destinataire en tant que classe dans le manifeste et il recevra l'intention:

<application
  ....
  <receiver Android:name=".ToastReceiver">
    <intent-filter>
      <action Android:name="com.unitedcoders.Android.broadcasttest.SHOWTOAST"/>
    </intent-filter>
  </receiver>
</application>

Et vous n'avez pas besoin de créer la classe manuellement dans ToastDisplay.

Dans le code que vous avez fourni, vous devez être dans l’activité ToastDisplay pour recevoir l’intention.

4
m_vitaly

Je pense que votre problème est que vous envoyez l'émission avant le début de l'autre activité! de sorte que l'autre activité ne recevra rien.

  1. La meilleure pratique pour tester votre code est d’envoyer une émission à partir d’un thread ou d’un service afin que l’activité soit ouverte et enregistrée. Le destinataire et le processus d’arrière-plan envoient un message.
  2. démarrez l'activité ToastDisplay à partir de l'activité d'expéditeur (je n'ai pas testé cela, mais cela pourrait fonctionner probablement)
1
daigoor

Vous oubliez d'écrire .show () à la fin, utilisé pour afficher le message de pain grillé.

Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT).show();

C'est une erreur courante de la part du programmeur, mais je suis sûr qu'après cela, vous ne répéterez plus l'erreur ...: D

1
Anu

Vous devez également enregistrer le destinataire dans onCreate (), comme ceci:

IntentFilter filter = new IntentFilter();
filter.addAction("csinald.meg");
registerReceiver(receiver, filter);
0
keybee