web-dev-qa-db-fra.com

Est-il possible d'obtenir le contexte de l'application dans un projet de bibliothèque Android Android?

Je voudrais obtenir le contexte de l'application qui a référencé/hébergé ma bibliothèque au moment de l'exécution dans une classe de mon projet de bibliothèque. C'est possible? Si oui, comment?

Merci

Mise à jour Je ne veux pas que mon utilisateur passe le contexte en paramètre à mon projet de bibliothèque car il est possible que mon projet de bibliothèque soit appelé via JNI et je n'ai aucune idée de comment obtenir du contexte dans JNI et passez-le à Java layer.

59
Haris Hasan

C'est possible?

Oui.

Si oui, comment?

Passez-le comme paramètre.

Je ne veux pas que mon utilisateur passe le contexte en paramètre à mon projet de bibliothèque car il est possible que mon projet de bibliothèque soit appelé via JNI et je n'ai aucune idée de comment obtenir du contexte dans JNI et le transmettre à Java.

Ensuite, déterminez "comment [vous] pouvez obtenir du contexte dans JNI et le transmettre à Java layer". J'imagine que vous le passeriez comme n'importe quel autre objet. Comme l'a noté @Blundell, vous le faites pas vraiment d'autre option.

12
CommonsWare

Il y a une autre façon, ajoutez une classe d'application dans votre projet de bibliothèque:

/**
 * Base class for those who need to maintain global application state.
 */
public class LibApp extends Application {

  /** Instance of the current application. */
  private static LibApp instance;

  /**
   * Constructor.
   */
  public LibApp() {
    instance = this;
  }

  /**
   * Gets the application context.
   * 
   * @return the application context
   */
  public static Context getContext() {
    return instance;
  }

}

Ensuite, dans votre projet normal, faites en sorte que la vraie classe d'application étende LibApp:

/**
 * Base class for those who need to maintain global application state.
 */
public class App extends LibApp {

  @Override
  public void onCreate() {
    super.onCreate();
  }

}

Assurez-vous que "Nom" est défini dans AndroidManifest:

<application Android:name="App" ...>

et que votre classe App est dans le package de base.

Vous pouvez ensuite utiliser LibApp.getContext () votre projet de bibliothèque pour obtenir le contexte d'application de l'application qui utilise la bibliothèque.

Ce n'est peut-être pas une bonne solution, mais cela fonctionne pour moi. Je le partage parce qu'il pourrait être utile à quelqu'un d'autre.

53
peceps

Il existe une autre façon d'obtenir du contexte dans jni, sans passer de paramètre ni enregistrer le contexte par vous-même, mais en utilisant Android api. J'ai trouvé qu'il y avait une classe nommée:

  • Android.app.AppGlobals

dans le code source. Et la fonction statique

  • getInitialApplication

    peut renvoyer un objet Application. Mais il doit être appelé dans le thread principal et la classe est masquée. Quoi qu'il en soit, vous pouvez l'utiliser en réfléchissant en Java. Et vous pouvez simplement utiliser FindClass() et FindStaticObjectMethod() pour découvrir la méthode et l'utiliser. J'espère que cela pourra aider.

9
Lam

Selon cet article vous pouvez laisser la bibliothèque s'initialiser automatiquement avec le contexte de l'application à l'aide d'un ContentProvider.

Soyez prudent de toute façon, comme décrit dans post comments , il peut y avoir des inconvénients concernant le temps de chargement et l'exécution instantanée, ainsi que des plantages sur les applications multi-processus.

HTH

0
Dario Fiumicello

Dans votre projet de bibliothèque, ajoutez une dépendance à votre projet principal. Dans IntelliJ, il le fera pour vous lorsque vous essayez de référencer cette variable globale. Dans Eclipse, je ne suis pas sûr ...

0
IgorGanapolsky

Je le passerais comme paramètre ou lui passerais un singleton dans cette bibliothèque.

Avoir l'application principale pour étendre la classe d'application de la bibliothèque est une mauvaise idée car Java vous ne pouvez étendre qu'une seule fois à partir d'une classe. Si votre application nécessite de passer à une autre bibliothèque, vous aurez des ennuis.

0
Sayooj Valsan