web-dev-qa-db-fra.com

Activité rafraîchissante à la réception d'une notification push gcm

Mise à jour: GCM est déconseillé, utilisez FCM

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

  • Une alternative consiste à ajouter timer qui effectue périodiquement des requêtes serveur et met à jour les données de l'adaptateur de liste mais je ne veux pas ceux-ci, car il faudra beaucoup de ressources.
  • Dois-je ajouter récepteur de diffusion qui se déclenchera à la réception de gcm Push qui demandera davantage de données de serveur plus récentes et mettra à jour mon activité UI?

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 .

50
Amrit Pal Singh

Ç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/

140
Arthur

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.

3
PaulG

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.

2
e4c5

Si votre application est déjà en cours d'exécution, essayez de remplacer la méthode onNewIntent

1
Amanni

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

0
Srneczek

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.

0
fbs419