Chaque fois que ma diffusion est exécutée, je souhaite afficher une alerte sur les activités de premier plan.
Réponses
Trop de publicités?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();
[[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.
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;
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"));
}