1
votes

Comment découvrir quelle activité est au premier plan dans l'application Android?

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>


1 commentaires

Un échantillon sur ce dépôt git peut aider


3 Réponses :


1
votes

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
    }

}


0 commentaires

0
votes

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.


1 commentaires

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



3
votes

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


0 commentaires