2013-02-25 11 views
11

Je saurais quelle est la meilleure pratique pour stocker des constantes globales qui peuvent changer avec l'environnement (debug, preprod, prod, release, etc) au moment de la compilation.Où stocker les constantes globales dans une application Android?

Dans iOS, j'utilisé pour conserver toutes les constantes globales dans un fichier d'en-tête et le modifier avec macro pré-processeur voir cette réponse:

Where to store global constants in an iOS application?

Quelle solution devrais-je utiliser pour Android?

Répondre

17

Créer une classe constantes dans votre dossier de package de base.

(ou créer une interface au lieu d'une classe donc il n'y a pas besoin de faire référence à la chaque fois que la classe, mais cela est bad practice en raison de la lisibilité du code, mais il fonctionnera)

Remplissez-le avec public static final valeurs.

En outre, à la fois le class ainsi que le interface peuvent également être déclarés comme abstract.

+1

Ok, mais comment puis-je le changer à la "compilation"? Je ne veux pas stocker, par exemple, toutes les valeurs trois fois (pour 3 environnements différents) et avoir à les commenter tous quand je le veux. – klefevre

+0

avec 3 environnements différents, vous voulez dire des projets? Créez ensuite une application de bibliothèque, dans laquelle vous créez votre classe de constantes, que vous ne pouvez pas ajouter en tant que bibliothèque, à autant de projets que vous le souhaitez. – Nickolaus

+2

Non, je veux dire 3 environnements tels que debug, preprod ou prod pour un projet. Je voudrais changer, par exemple, l'URL de base (tout comme la réponse que j'ai citée dans ma question) de mon API webservice 'http://prepod.xxx.com/ws', 'http://www.xxx. com/ws ',' http://192.168.1.42/ws 'avec seulement 1 constante pour changer comme "DEBUG", "PREPROD", "PROD" – klefevre

2

Si les valeurs de vos constantes dépendent de l'environnement (densité, paramètres régionaux, etc.), vous devez utiliser des ressources pour les stocker (entier, chaîne, dimension, etc.). Dans un autre cas, vous pouvez mettre vos constantes globales dans un fichier (meilleures pratiques - utiliser des préfixes pour chaque ensemble de constantes) ou mettre des constantes locales dans des classes associées (par exemple, Intent contient des drapeaux, des extras, des catégories, etc.) .

+0

pourriez-vous me montrer un extrait pour illustrer votre réponse plz? – klefevre

+0

Comme j'ai compris votre commentaire ci-dessus, vous devriez utiliser Maven (outil pour la construction automatisée). Vous pouvez déterminer différentes constantes pour différentes configurations et Maven construira des apk différents pour vous (chaque apk utilise un ensemble de constantes). Voir cette question pour plus de détails http://stackoverflow.com/questions/13867148/maven-and-android-slightly-different-builds-for-different-environments – tundundun

2

Utilisez public static final values. et les garder dans le fichier java séparé comme suit:

static String QC = "http:/************"; 
    static String DEV = "http:/************"; 
    static String CLOUD = "http:/************"; 


    static String SERVICEURL = CLOUD ; //Use this SERVICEURL in your code at run time 
2

Une autre solution pourrait être d'utiliser le fichier de ressources (si vous êtes content de ne stockant que les valeurs de chaîne).

Cela pourrait être utilisé pour stocker des constantes telles que le compte que cette application gère:

Ex. WelcomeActivity.java

AccountManager am = AccountManager.get(WelcomeActivity.this); 
Account account = am.getAccountsByType(getResources().getString(R.string.ACCOUNT_TYPE))[0]; 

Ex. res/valeurs/strings.xml

<resources> 
    <string name="ACCOUNT_NAME">com.acme.MyAccountSignature</string> 
</resources> 

Cela vous permet également de modifier ce sans qu'il soit nécessaire de recompiler (de la même façon dont vous le feriez normalement découpler traductions, que le fichier strings.xml est mieux utilisé pour).

Questions connexes