202 votes

Comment obtenir le contexte actuel de l'activité de premier plan dans Android?

Chaque fois que ma diffusion est exécutée, je souhaite afficher une alerte sur les activités de premier plan.

226voto

gezdy Points 1200

N'UTILISEZ PAS de PRÉCÉDENT (waqas716) réponse.

Vous aurez des problème de fuite de mémoire, à cause de la statique de référence à l'activité. Pour plus de détails, consultez le lien suivant http://android-developers.blogspot.fr/2009/01/avoiding-memory-leaks.html

Pour éviter cela, vous devez gérer les activités des références. Ajouter le nom de l'application dans le fichier manifeste:

<application
    android:name=".MyApp"
    ....
 </application>

Votre classe d'application :

  public class MyApp extends Application {
        public void onCreate() {
              super.onCreate();
        }

        private Activity mCurrentActivity = null;
        public Activity getCurrentActivity(){
              return mCurrentActivity;
        }
        public void setCurrentActivity(Activity mCurrentActivity){
              this.mCurrentActivity = mCurrentActivity;
        }
  }

Créer une nouvelle Activité :

public class MyBaseActivity extends Activity {
    protected MyApp mMyApp;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mMyApp = (MyApp)this.getApplicationContext();
    }
    protected void onResume() {
        super.onResume();
        mMyApp.setCurrentActivity(this);
    }
    protected void onPause() {
        clearReferences();
        super.onPause();
    }
    protected void onDestroy() {        
        clearReferences();
        super.onDestroy();
    }

    private void clearReferences(){
        Activity currActivity = mMyApp.getCurrentActivity();
        if (currActivity != null && currActivity.equals(this))
            mMyApp.setCurrentActivity(null);
    }
}

Donc, maintenant, au lieu de l'extension de l'Activité de classe pour vos activités, juste étendre MyBaseActivity. Maintenant, vous pouvez obtenir votre courant de l'activité de l'application ou de l'Activité contexte comme ça :

Activity currentActivity = ((MyApp)context.getApplicationContext()).getCurrentActivity();

70voto

waqas716 Points 1457

[[Mise à JOUR]]

Comme indiqué par @gezdy, et j'en suis reconnaissante. de référence définie à null pour l'activité en cours, au lieu de la mise à jour sur tous les onResume set null sur toutes les Activités du onDestroy pour éviter le problème de fuite de mémoire.

Il y a un moment j'avais besoin de la même fonctionnalité et ici est la méthode de la façon dont j'ai réalisé cela. Dans chacune de vos activités remplacer ces cycle de vie des méthodes.

@Override
protected void onResume() {
    super.onResume();
    appConstantsObj.setCurrentActivity(this);

}

@Override
protected void onPause() {
   clearReferences();
   super.onPause();
}

@Override
protected void onDestroy() {        
   clearReferences();
   super.onDestroy();
}

private void clearReferences(){
          Activity currActivity = appConstantsObj.getCurrentActivity();
          if (currActivity != null && currActivity.equals(this))
                appConstantsObj.setCurrentActivity(null);
}

Maintenant dans votre diffusion en classe, vous pouvez accéder à l'activité en cours pour afficher une alerte sur elle.

44voto

KAlO2 Points 87

Sachant qu'ActivityManager gère l' activité , nous pouvons donc obtenir des informations à partir d' ActivityManager . Nous obtenons l’activité courante de premier plan par

 ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
 

-1voto

Rubber Duck Points 380

La réponse par waqas716 est bon. J'ai créé une solution de contournement pour un cas spécifique exigeant moins de code et de maintenance.

J'ai trouvé un travail spécifique autour de [Moche mais efficace] par une méthode statique chercher un point de vue de l'activité, je le soupçonne d'être à l'avant-plan [vous pouvez parcourir toutes les activités et de vérifier si vous le souhaitez, ou obtenir le nom de l'activité à partir de la réponse de martin

ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity; 
].

J'ai ensuite vérifier si la vue n'est pas null et obtenir le contexte via getContext().

View v = SuspectedActivity.get_view();

if(v != null)
{
    // an example for using this context for something not permissible in global application context. 
    v.getContext().startActivity(new Intent("rubberduck.com.activities.SomeOtherActivity"));
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X