70 votes

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

Je souhaite connaître 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 paramètre context en paramètre à mon projet de bibliothèque car il est possible que mon projet de bibliothèque soit appelé via JNI et je ne sais pas comment je peux obtenir un contexte dans JNI et le transmettre à la couche Java.

57voto

peceps Points 7246

Il existe un autre moyen, ajouter une application de classe 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 de faire de la vraie classe d'application s'étendre 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 vous avez "Nom" défini dans AndroidManifest:

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

et que votre Appli classe dans le package de base.

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

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

14voto

CommonsWare Points 402670

Est-il possible?

Oui.

Si oui, comment?

Passer comme paramètre.

Je ne veux pas que mon utilisateur à passer contexte dans les paramètre de mon projet de bibliothèque car il est possible que mon projet de bibliothèque sera appelé par JNI et je n'ai aucune idée de comment je peux les mettre en contexte dans la JNI et le passer à Java couche.

Ensuite, la figure de "la façon dont vous pouvez obtenir contexte dans JNI et le passer à Java couche". J'imagine que vous devez passer comme n'importe quel autre objet. Comme @Blundell a noté, vous n'avez pas vraiment d'autre option.

13voto

Lam Points 21

Il y a une autre façon de les mettre en contexte dans jni, ni le passage d'un paramètre, ni d'économie d'contexte par vous-même, mais par l'aide de l'api android. J'ai trouvé qu'il y a une classe nommée:

  • android.app.AppGlobals

dans le code source. Et la fonction statique

  • getInitialApplication

    pouvez nous retourner un Application objet. Mais il doit être appelé dans le thread principal, et la classe est caché. De toute façon vous pouvez l'utiliser en reflétant dans java. Et vous pouvez simplement utiliser FindClass() et FindStaticObjectMethod() de trouver la méthode, et de l'utiliser. Espérons que cela aide.

0voto

Igor Ganapolsky Points 2851

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

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