Comment rafraîchir l'activité sur recevoir la notification push gcm si mon application est ouvert . J'ai une activité qui contient listview remplie de données du serveur. Je veux rafraîchir mon activité ( ici en ajoutant un élément de plus à listview), si je reçois une notification push gcm ( qui contient également des données).
Chers commentateurs, veuillez lire attentivement la question, je n'ai qu'à rafraîchir la liste (si l'application est ouverte et que cette activité particulière est ouverte) sinon pas besoin de même .
Ça m'a pris quelques heures pour le comprendre. Publier ici au cas où quelqu'un d'autre aurait le même problème.
L'idée est que vous devez enregistrer votre activité en tant que récepteur de diffusion. La façon la plus simple de procéder est la suivante:
//register your activity onResume()
@Override
public void onResume() {
super.onResume();
context.registerReceiver(mMessageReceiver, new IntentFilter("unique_name"));
}
//Must unregister onPause()
@Override
protected void onPause() {
super.onPause();
context.unregisterReceiver(mMessageReceiver);
}
//This is the handler that will manager to process the broadcast intent
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Extract data included in the Intent
String message = intent.getStringExtra("message");
//do other stuff here
}
};
Le code ci-dessus va dans l'activité que vous souhaitez "écouter" pour les événements.
Maintenant, comment pouvons-nous envoyer des données à cet "auditeur"? Accédez à votre gestionnaire de notifications Push (ou d'où vous souhaitez mettre à jour votre activité) et lorsque vous recevez une notification, appelez cette fonction:
// This function will create an intent. This intent must take as parameter the "unique_name" that you registered your activity with
static void updateMyActivity(Context context, String message) {
Intent intent = new Intent("unique_name");
//put whatever data you want to send, if any
intent.putExtra("message", message);
//send broadcast
context.sendBroadcast(intent);
}
Lorsque vous appelez la fonction ci-dessus, votre activité devrait la recevoir.
Remarque : Votre activité doit être en cours d'exécution/ouverte pour recevoir l'intention de diffusion
Note2 : Je suis passé à une bibliothèque appelée 'otto'. En fait, c'est la même chose mais plus facile, "diffuse des événements" dans l'application. Voici un lien http://square.github.io/otto/
Je suppose que votre GCMBroadcastReceiver
se trouve dans son propre fichier .Java?
En ce qui concerne l'actualisation d'une activité, j'aimerais également connaître la réponse à cette question.
Mais pour savoir si une activité particulière est active ou non, ce qui signifie à l'écran, ajoutez simplement un boolean
(appelez-le quelque chose comme "actif") et définissez-le sur true
dans la fonction onResume()
événement, et à false
dans l'événement onPause()
:
protected void onResume()
{
super.onResume();
active = true;;
}
protected void onPause()
{
super.onPause();
active = false;
}
Votre variable active
serait un booléen qui est global
ou static
. De cette façon, vous savez si une activité particulière est en "avant".
J'espère que ça aidera un peu.
La réponse d'acceptation est en effet correcte pour "l'activité rafraîchissante à la réception de la notification push gcm" (je l'ai également mise à jour). Mais si vous souhaitez uniquement mettre à jour un ListView qui est affiché, vous n'avez pas besoin d'un récepteur de diffusion.
Votre service d'écoute GCM peut mettre à jour la base de données à l'aide d'un ContentProvider plutôt que d'insérer une requête SQL directe.
Ensuite, vous pouvez compter sur la méthode notifyChange du ContentResolver pour faire l'affaire.
Avertissez les observateurs enregistrés qu'une ligne a été mise à jour. Pour vous inscrire, appelez registerContentObserver (). Par défaut, les objets CursorAdapter recevront cette notification. Si syncToNetwork est vrai, cela tentera de planifier une synchronisation locale à l'aide de l'adaptateur de synchronisation qui est enregistré pour l'autorité de l'uri fourni. Aucun compte ne sera transmis à l'adaptateur de synchronisation, donc tous les comptes correspondants seront synchronisés.
Si votre application est déjà en cours d'exécution, essayez de remplacer la méthode onNewIntent
Pour résumer en une seule phrase: Si vous souhaitez actualiser l'activité, diffusion votre événement personnalisé lorsque la notification arrive et inscription votre activité comme récepteur de diffusion de cet événement
Semble qu'il existe un moyen plus simple. Dans la méthode OnMessageReceived de l'écouteur GCM, vous pouvez simplement effectuer la mise à jour à partir de là au lieu d'envoyer la notification. Vous pouvez utiliser le même code que vous auriez utilisé lors du traitement de la notification. Si vous faites StartActivity à partir de l'écouteur, vous devez utiliser l'indicateur ActivityFlags.NewTask.