Je dois implémenter la logique - Si l'utilisateur est sur l'activité de chat, je n'ai pas besoin d'afficher une notification push avec un nouveau message. J'ai donc besoin de savoir quelle activité est à l'écran. A cet effet, j'ai trouvé cette réponse Comment obtenir le contexte actuel de l'activité au premier plan sous Android? Mais je ne comprends pas comment utiliser
public void registerActivityLifecycleCallbacks (Application.ActivityLifecycleCallbacks callback)
Quelqu'un peut-il me donner un exemple complet comment découvrir quelle activité est à l'écran?
p>
3 Réponses :
Voici la structure de base de ce que vous devez faire:
public class AmpApplication extends Application implements Application.ActivityLifecycleCallbacks { public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(this); } @Override public void onActivityCreated(Activity activity, Bundle bundle) { // do nothing } @Override public void onActivityStarted(Activity activity) { // do nothing } @Override public void onActivityResumed(Activity activity) { if(activity instanceof ChatActivity) { // chat activity is in foreground } } @Override public void onActivityPaused(Activity activity) { // do nothing } @Override public void onActivityStopped(Activity activity) { // do nothing } }
Vos notifications push sont reçues par classe de service dans votre application (et je suppose que vous êtes intéressé par l'activité au premier plan de votre application, c'est-à-dire la même base de code).
Il existe peut-être des solutions plus élégantes et plus intelligentes, mais vous pouvez aussi en faire une un peu grossière comme celle-ci:
Ajoutez un indicateur ( static boolean doNotCreateNotification = false;
suffit pour le scénario simple d'activité de chat interdisant les notifications) à la classe MyApplication extend Application
(ajoutez-en un n'en avez pas encore dans votre projet, assurez-vous de reconfigurer correctement le projet pour utiliser la classe Application
personnalisée).
Désormais, cet indicateur statique sera quasiment "global" pour tout le code qui s'exécute à partir de votre application, y compris toutes les activités et / ou les notifications de traitement du service en arrière-plan.
Le cycle de vie de Activity
garantit que onResume
est appelé lorsque l'activité devient au premier plan + active, et onPause
lorsque l'activité quitte cet état . Vous pouvez donc mettre à jour l'indicateur global dans ces derniers sur true / false dans les méthodes onResume / onPause
.
Ensuite, dans le service traitant la notification reçue, vous pouvez vérifier si l'indicateur est défini sur true
et simplement supprimer les données de notification sans créer de badge dans le système d'exploitation.
La réponse "Rajasekaran M" fait en principe la même chose, mais semble un peu moins hack-ish, car vous accédez à l'instance Application
via l'interface de rappel du cycle de vie, qui est conçue pour ce type de trucs, alors que l'accès direct aux champs statiques dans Application
personnalisée est une chose un peu moche (par exemple rend les tests unitaires beaucoup plus difficiles).
Vous devez implémenter onActivityPaused
et onActivityResumed()
public class YourApplication extends Application implements Application.ActivityLifecycleCallbacks { public static boolean isChatVisible=false; public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(this); } @Override public void onActivityCreated(Activity p0, Bundle p1) { } @Override public void onActivityStarted(Activity p0) { } @Override public void onActivityResumed(Activity p0) { isChatVisible=p0 instanceof ChatActivity; } @Override public void onActivityPaused(Activity p0) { } @Override public void onActivityStopped(Activity p0) { } }
Avant de créer la notification, vérifiez simplement YourApplication.isChatVisible ( )
Un échantillon sur ce dépôt git peut aider