Activité de rafraîchissement à la réception de la notification push gcm

Mise à jour: GCM est obsolète, utilisez FCM

Comment actualiser l’ activité lors de la réception d’une notification push gcm si mon application est ouverte . J’ai une activité qui contient une vue de liste remplie de données du serveur. Je souhaite actualiser mon activité (en ajoutant ici un autre élément à listview ), si je reçois une notification push gcm (qui contient également des données).

  • Une alternative consiste à append un temporisateur qui effectue périodiquement les requêtes du serveur et à mettre à jour les données de l’adaptateur de liste, mais je ne les souhaite pas car cela nécessitera beaucoup de ressources.
  • Dois-je append un récepteur de diffusion qui se déclenche à la réception de gcm push et qui demande des données de serveur plus récentes et met à jour mon interface utilisateur?

Chers commentateurs, veuillez lire attentivement la question, je n’ai besoin que de rafraîchir la liste (si l’application est ouverte et que cette activité particulière est ouverte) sinon pas besoin de la même chose .

Il m’a fallu 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 Ssortingng message = intent.getSsortingngExtra("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 notification push (ou depuis lequel 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, Ssortingng 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 le recevoir.

Remarque : votre activité doit être en cours d’exécution / ouverte pour recevoir l’intention de diffusion

Note 2 : Je suis passé à une bibliothèque appelée «otto». Il fait en réalité 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 est dans son propre fichier .java?

Pour ce qui est de rafraîchir une activité, j’aimerais également connaître la réponse à cette question.

Mais pour savoir si une activité particulière est active ou non, il suffit d’append un boolean (appelez-le quelque chose comme “actif”) et définissez-le sur true dans l’ onResume() votre activité et sur false dans l’ onPause() :

 protected void onResume() { super.onResume(); active = true;; } protected void onPause() { super.onPause(); active = false; } 

Votre variable active serait un booléen 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 “Activité de rafraîchissement sur la réception de la notification push gcm” (je l’ai également votée). Mais si vous souhaitez uniquement mettre à jour un ListView affiché, vous n’avez pas besoin d’un récepteur de diffusion.

Votre service d’écoute GCM peut mettre à jour la firebase database à 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 le tour.

Notifier les observateurs enregistrés qu’une ligne a été mise à jour. Pour vous inscrire, appelez registerContentObserver (). Par défaut, les objects CursorAdapter obtiendront cette notification. Si syncToNetwork a la valeur true, cela tentera de planifier une synchronisation locale à l’aide de l’adaptateur de synchronisation enregistré pour les droits de l’URI fourni. Aucun compte ne sera transmis à l’adaptateur de synchronisation, de sorte que 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

Il semble y avoir un moyen plus facile. Dans la méthode OnMessageReceived de l’écouteur GCM, vous pouvez simplement effectuer la mise à jour à partir de là plutôt que d’envoyer la notification. Vous pouvez utiliser le même code que vous auriez utilisé si vous traitiez la notification. Si vous faites StartActivity à partir de l’écouteur, vous devez utiliser l’indicateur ActivityFlags.NewTask.

Pour résumer en une phrase: Si vous souhaitez actualiser une activité, diffusez votre événement personnalisé lorsque la notification arrive et enregistrez votre activité en tant que récepteur de diffusion de cet événement.

 Intent notificationIntent = new Intent(context, MainActivity.class); notificationIntent.setAction(Long.toSsortingng(System.currentTimeMillis())); PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);