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>
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.
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();
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);
}
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.
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.
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
Vous devez également enregistrer le destinataire dans onCreate (), comme ceci:
IntentFilter filter = new IntentFilter();
filter.addAction("csinald.meg");
registerReceiver(receiver, filter);