webentwicklung-frage-antwort-db.com.de

Android globale Variable

Wie kann ich globale Variablen erstellen? Behalte Werte während des gesamten Lebenszyklus der Anwendung, unabhängig davon, welche Aktivität ausgeführt wird.

276
d-man

Sie können die Basis erweitern Android.app.Application class und füge Mitgliedsvariablen wie folgt hinzu:

public class MyApplication extends Application {

    private String someVariable;

    public String getSomeVariable() {
        return someVariable;
    }

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

In Ihrem Android Manifest müssen Sie die Klasse deklarieren, die Android.app.Application implementiert (fügen Sie das Android:name=".MyApplication"-Attribut für das vorhandene Anwendungstag):

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

Dann können Sie in Ihren Aktivitäten die Variable wie folgt abrufen und festlegen:

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

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

Sie können ein Singleton Pattern so was:

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;
    }
}

In Ihrer Anwendung können Sie folgendermaßen auf Ihren Singleton zugreifen:

MyProperties.getInstance().someValueIWantToKeep
41
Ramps

Diese globale Variable funktioniert für mein Projekt:

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

Sie können die Anwendungseinstellungen verwenden. Solange Sie das Context-Objekt übergeben, können Sie von jeder Aktivität oder jedem Code aus auf sie zugreifen. Sie sind für die Anwendung, die sie verwendet, privat. Sie müssen sich also keine Gedanken darüber machen, anwendungsspezifische Werte verfügbar zu machen, es sei denn, Sie beschäftigen sich mit Routing Geräte. Trotzdem können Sie Hashing- oder Verschlüsselungsschemata verwenden, um die Werte zu speichern. Diese Einstellungen werden auch von einem Anwendungslauf zum nächsten gespeichert. Hier sind einige Codebeispiele, die Sie ansehen können.

13
r1k0

Es gibt verschiedene Möglichkeiten, um das zu erreichen, wonach Sie suchen.

1.) Erweitern Sie die Anwendungsklasse und instanziieren Sie dort Ihre Controller- und Modellobjekte.

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;
    }

}

Dann können Sie den Singleton jederzeit von Ihrem benutzerdefinierten Anwendungsobjekt aus aufrufen:

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.) Sie können Ihren Controller einfach eine einzelne Instanz von sich selbst erstellen lassen:

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;
    }
}

Dann können Sie die create-Methode einfach von jeder Aktivität oder jedem Fragment aus aufrufen und sie erstellt einen neuen Controller, falls noch keiner vorhanden ist. Andernfalls wird der bereits vorhandene Controller zurückgegeben.

3.) Schließlich gibt es bei Square ein schickes Framework, mit dem Sie Abhängigkeiten in Android einfügen können. Es heißt Dolch . Ich werde hier nicht darauf eingehen, wie man es benutzt, aber es ist sehr geschickt, wenn man so etwas braucht.

Ich hoffe, ich habe genug Einzelheiten dazu angegeben, wie Sie das tun können, was Sie sich erhofft haben.

7
Dan Mikita

Sie können ein Global Class so was:

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;
    }
}

Dann definieren Sie es im Manifest:

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

Jetzt können Sie Werte für die globale Variable wie folgt festlegen:

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

Sie können diese Werte wie folgt erhalten:

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

Ein vollständiges Beispiel finden Sie in diesem Blog Globale Variablen

4
san88

Versuchen Sie wie folgt:

Erstellen Sie eine gemeinsam genutzte Datenklasse:

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;
    }



}

Deklariert/initialisiert eine Instanz einer Klasse global in den Klassen, in denen Sie Daten festlegen/abrufen möchten (mit diesem Code vor der onCreate() -Methode):

Globals sharedData = Globals.getInstance();

Daten einstellen:

sharedData.setValue("kundan");

Daten bekommen:

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

Ich habe nach ähnlichen Antworten gesucht, aber die hier angegebenen passen nicht zu meinen Anforderungen. Ich finde etwas, nach dem Sie aus meiner Sicht suchen. Der einzig mögliche schwarze Punkt ist eine Sicherheitsfrage (oder vielleicht auch nicht), da ich nichts über Sicherheit weiß.

Ich schlage vor, Interface zu verwenden (es ist nicht erforderlich, Class mit einem Konstruktor zu verwenden usw.), da Sie nur Folgendes erstellen müssen:

public interface ActivityClass {

    public static final String MYSTRING_1 = "STRING";

    public static final int MYINT_1 = 1;

}

Dann können Sie überall in Ihren Klassen zugreifen, indem Sie Folgendes verwenden:

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

Verwenden Sie SharedPreferences, um globale Variablen zu speichern und abzurufen.

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

Technisch beantwortet dies nicht die Frage, aber ich würde empfehlen, die Raumdatenbank anstelle einer globalen Variablen zu verwenden. https://developer.Android.com/topic/libraries/architecture/room.html Auch wenn Sie "nur" eine globale Variable speichern müssen und es keine große Sache ist und was nicht, aber mit Die Raumdatenbank ist die eleganteste, einheimischste und am besten unterstützte Methode, um Werte über den gesamten Lebenszyklus einer Aktivität zu erhalten. Dies hilft, viele Probleme zu vermeiden, insbesondere die Datenintegrität. Ich verstehe, dass die Datenbank und die globale Variable unterschiedlich sind, verwende aber bitte Raum, um den Code zu pflegen, die Stabilität der App und die Datenintegrität zu gewährleisten.

1
hexicle

Wenn möglich, sollten Sie die Variablen deklarieren, die Sie am Leben erhalten müssen und die von Garbage Collector nicht gelöscht oder vom Betriebssystem in die Datei entladen wurden Laden Sie es in Ihre MainActivity.

0
Tran Huu Phuoc