web-dev-qa-db-fra.com

Android variable globale

Comment puis-je créer une variable globale conserver des valeurs tout au long du cycle de vie de l'application, quelle que soit l'activité en cours d'exécution?.

276
d-man

Vous pouvez étendre la classe de base Android.app.Application et ajouter des variables de membre de la manière suivante:

public class MyApplication extends Application {

    private String someVariable;

    public String getSomeVariable() {
        return someVariable;
    }

    public void setSomeVariable(String someVariable) {
        this.someVariable = someVariable;
    }
}

Dans votre manifeste Android, vous devez déclarer la classe implémentant Android.app.Application (ajoutez l'attribut Android:name=".MyApplication" à la balise d'application existante):

<application 
  Android:name=".MyApplication" 
  Android:icon="@drawable/icon" 
  Android:label="@string/app_name">

Ensuite, dans vos activités, vous pouvez obtenir et définir la variable comme suit:

// set
((MyApplication) this.getApplication()).setSomeVariable("foo");

// get
String s = ((MyApplication) this.getApplication()).getSomeVariable();
505
Jeff Gilfelt

Vous pouvez utiliser un Singleton Pattern comme ceci:

package com.ramps;

public class MyProperties {
private static MyProperties mInstance= null;

public int someValueIWantToKeep;

protected MyProperties(){}

public static synchronized MyProperties getInstance() {
        if(null == mInstance){
            mInstance = new MyProperties();
        }
        return mInstance;
    }
}

Dans votre application, vous pouvez accéder à votre singleton de cette manière:

MyProperties.getInstance().someValueIWantToKeep
41
Ramps

Cette variable globale fonctionne pour mon projet:

public class Global {
    public static int ivar1, ivar2;
    public static String svar1, svar2;
    public static int[] myarray1 = new int[10];
}


//  How to use other or many activity
Global.ivar1 = 10;

int i = Global.ivar1;
13
mahasam

Vous pouvez utiliser les préférences de l'application. Ils sont accessibles à partir de n'importe quelle activité ou élément de code tant que vous transmettez l'objet Context. Ils sont privés de l'application qui les utilise. Vous n'avez donc pas à vous soucier d'exposer des valeurs spécifiques à l'application, à moins que vous ne traitiez avec des routeurs. dispositifs. Même dans ce cas, vous pouvez utiliser des schémas de hachage ou de cryptage pour enregistrer les valeurs. En outre, ces préférences sont stockées d'une application à l'autre. Here Voici quelques exemples de code que vous pouvez consulter.

13
r1k0

Il existe différentes manières d’atteindre ce que vous demandez.

1.) Développez la classe d'applications et instanciez-y votre contrôleur et vos objets modèle.

public class FavoriteColorsApplication extends Application {

    private static FavoriteColorsApplication application;
    private FavoriteColorsService service;

    public FavoriteColorsApplication getInstance() {
        return application;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        application = this;
        application.initialize();
    }

    private void initialize() {
        service = new FavoriteColorsService();
    }

    public FavoriteColorsService getService() {
        return service;
    }

}

Vous pouvez ensuite appeler le singleton de votre objet Application personnalisé à tout moment:

public class FavoriteColorsActivity extends Activity {

private FavoriteColorsService service = null;
private ArrayAdapter<String> adapter;
private List<String> favoriteColors = new ArrayList<String>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_favorite_colors);

    service = ((FavoriteColorsApplication) getApplication()).getService();
    favoriteColors = service.findAllColors();

    ListView lv = (ListView) findViewById(R.id.favoriteColorsListView);
    adapter = new ArrayAdapter<String>(this, R.layout.favorite_colors_list_item,
            favoriteColors);
    lv.setAdapter(adapter);
}

2.) Vous pouvez demander à votre contrôleur de créer simplement une instance singleton:

public class Controller {
    private static final String TAG = "Controller";
    private static sController sController;
    private Dao mDao;

    private Controller() {
        mDao = new Dao();    
    }

    public static Controller create() {
        if (sController == null) {
            sController = new Controller();
        }
        return sController;
    }
}

Ensuite, vous pouvez simplement appeler la méthode create à partir de n'importe quelle activité ou fragment et il créera un nouveau contrôleur s'il n'en existe pas déjà un, sinon il retournera le contrôleur préexistant.

3.) Enfin, il existe un cadre élégant créé par Square qui vous fournit une injection de dépendance au sein d'Android. Cela s'appelle Dague . Je ne vais pas vous expliquer comment l'utiliser ici, mais c'est très astucieux si vous avez besoin de ce genre de chose.

J'espère avoir donné suffisamment de détails sur la manière dont vous pouvez faire ce que vous espérez.

7
Dan Mikita

Vous pouvez créer un Global Class comme ceci:

public class GlobalClass extends Application{

    private String name;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String aName) {
        name = aName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String aEmail) {
        email = aEmail;
    }
}

Puis définissez-le dans le manifeste:

<application
    Android:name="com.example.globalvariable.GlobalClass" ....

Maintenant, vous pouvez définir des valeurs pour variable globale comme ceci:

final GlobalClass globalVariable = (GlobalClass) getApplicationContext();
globalVariable.setName("Android Example context variable");

Vous pouvez obtenir ces valeurs comme ceci:

final GlobalClass globalVariable = (GlobalClass) getApplicationContext();
final String name  = globalVariable.getName();

Veuillez trouver un exemple complet sur ce blog Global Variables

4
san88

Essayez comme ça:

Créez une classe de données partagée:

SharedData.Java

import Android.app.Application;

/**
 * Created by kundan on 6/23/2015.
 */
public class Globals {


    private static Globals instance = new Globals();

    // Getter-Setters
    public static Globals getInstance() {
        return instance;
    }

    public static void setInstance(Globals instance) {
        Globals.instance = instance;
    }

    private String notification_index;


    private Globals() {

    }


    public String getValue() {
        return notification_index;
    }


    public void setValue(String notification_index) {
        this.notification_index = notification_index;
    }



}

Déclaré/Initiaze une instance de classe globalement dans les classes où vous voulez définir/obtenir des données (en utilisant ce code avant la méthode onCreate()): -

Globals sharedData = Globals.getInstance();

Définir les données:

sharedData.setValue("kundan");

Obtenir des données:

String n = sharedData.getValue();
4
kumar kundan
// My Class Global Variables  Save File Global.Java
public class Global {
    public static int myVi; 
    public static String myVs;
}

// How to used on many Activity

Global.myVi = 12;
Global.myVs = "my number";
........
........
........
int i;
int s;
i = Global.myVi;
s = Global.myVs + " is " + Global.myVi;
3
mahasam

J'ai vérifié pour une réponse similaire, mais ceux donnés ici ne répondent pas à mes besoins. Je trouve quelque chose qui, de mon point de vue, est ce que vous recherchez. Le seul point noir possible est une question de sécurité (ou peut-être pas) puisque je ne connais pas la sécurité.

Je suggère d'utiliser Interface (pas besoin d'utiliser Class avec constructeur, etc.), car il vous suffit de créer quelque chose comme:

public interface ActivityClass {

    public static final String MYSTRING_1 = "STRING";

    public static final int MYINT_1 = 1;

}

Ensuite, vous pouvez accéder partout dans vos cours en utilisant les éléments suivants:

int myInt = ActivityClass.MYINT_1;
String myString = ActivityClass.MYSTRING_1;
2
Alexandre

Utilisez SharedPreferences pour stocker et récupérer des variables globales.

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
String userid = preferences.getString("userid", null);
1
Coen Damen

Techniquement, cela ne répond pas à la question, mais je recommanderais d'utiliser la base de données Room au lieu de toute variable globale. https://developer.Android.com/topic/libraries/architecture/room.html Même si vous n’avez "que" besoin de stocker une variable globale Et ce n'est pas grave et ce qui ne l'est pas, mais utiliser la base de données Room est le moyen le plus élégant, natif et le mieux supporté de conserver des valeurs tout au long du cycle de vie de l'activité. Cela aidera à prévenir de nombreux problèmes, notamment l'intégrité des données. Je comprends que la base de données et la variable globale sont différentes, mais veuillez utiliser Room pour des raisons de maintenance du code, de stabilité des applications et d’intégrité des données.

1
hexicle

Si possible, vous devez déclarer les variables que vous devez maintenir en vie et qui n'ont pas été effacées par Garbage Collector ou Unload by OS dans le fichier .so. Pour ce faire, vous devez coder par C/C++ et les compiler dans un fichier .so lib. chargez-le dans votre MainActivity.

0
Tran Huu Phuoc