Android global değişkeni


293

Hangi değişkenin çalıştığından bağımsız olarak, uygulamanın global yaşam döngüsü boyunca kalan değerleri nasıl koruyabilirim?


Ve neden set ve get kullanmalıyız (Jeff Gilfelt'in asnwer) ?! Neden değeri doğrudan değişkene ayarladık? bunun gibi: genel uçucu statik String x; ve değeri ayarlamak için: GeneralClass.x = değer;
Dr.jacky

Yanıtlar:


531

Temel android.app.Applicationsınıfı genişletebilir ve aşağıdaki gibi üye değişkenleri ekleyebilirsiniz:

public class MyApplication extends Application {

    private String someVariable;

    public String getSomeVariable() {
        return someVariable;
    }

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

Android manifestinizde android.app.Application uygulayan sınıfı bildirmeniz gerekir ( android:name=".MyApplication"mevcut uygulama etiketine özniteliği ekleyin ):

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

Daha sonra aktivitelerinizde değişkeni aşağıdaki gibi alabilir ve ayarlayabilirsiniz:

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

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

4
harika yardım, gerçekten başvuruyorum.
d-man

6
Ne yazık ki benim için çalışmıyor. Lütfen bundan sonra manifest'te iki <application> etiketine sahip olacağımızı doğrulayın. Sağ? Çünkü bazı yerlerde insanların bunu mevcut uygulama etiketine eklememiz gerektiğini söylediğini duydum. Lütfen yardım et !!
Adil Malik

9
@AdilMalik Mevcut uygulama etiketine android: ad etiketi eklemelisiniz
Marijn

2
Neden yalnızca bir bağlama erişmeye gerek kalmadan genel statik alanları olan bir sınıf oluşturmuyorsunuz?
Laserson

51
Bu, doğru bir yanıt olmamalıdır, çünkü beklenmedik davranışlara ve bellek temizleme nedeniyle NPE'ye neden olabilir. developerphil.com/dont-store-data-in-the-application-object
bakua

43

Bunun gibi kullanabilirsiniz Singleton Pattern:

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

Başvurunuzda singletonunuza şu şekilde erişebilirsiniz:

MyProperties.getInstance().someValueIWantToKeep

28
Etkinlik duraklatılır ve kullanıcı başka bir uygulama başlattıysa ve bu memeory düşükse, kullanıcı uygulamayı sürdürdüğünde ve bu statik referansı boş bulduğunda android neden bu statik nesneyi kaldırdı ???
d-man

4
Statik, ayrı süreçlerdeki faaliyetler arasında işe yaramaz.
ateiob

3
örneğin çöp toplanmışsa bu işe yaramaz. yani kod bloğu if (null == mInstance) {mInstance = new MyProperties (); } çalışacak ve özellikleri sıfırlayacak yeni örnek döndürülecektir
Lalith B

1
@ Mr.Hyde Singleton, Singleton'un içinde ne tutacağımızı bilmemiz gerektiği için işe yaramaz, Eğer büyük bitmap dizisini veya bazı koleksiyonları tutarsak tehlikeli olabilir. Singleton içinde neleri sakladığınızı not edin.
Lalith B

1
Biraz geç kaldığımı biliyorum, ancak gelecekteki okuyucular için SharedPreferences, SQLLite Veritabanı veya Dahili bellek dosyasında değerler saklayabiliriz. Tüm bunlar uygulama kapalı olsa bile veri kalıcılığına sahip olacaktır.
powernit

15

Bu küresel değişken projem için çalışıyor:

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;

2
Ama sonra bunu birden fazla aktiviteye nasıl geçirirsiniz?
Zapnologica

15
Uygulama durduğunda ve cihazın belleği yetersiz olduğunda bu statikler (en azından dize ve dizi) android VM tarafından geçersiz kılınabilir.
Anton

4
@mahasam statikin doğru yol olması gerektiğini düşünmüyorum ... eğer tek aktivitesi varsa, Uygulama bağlamı ile olmalıdır. Yukarıdaki diğer cevaplarda verilen şekilde tek bir yol. statik kodu güçlü bir şekilde birleştirir ve ayrıca test edilebilirliği azaltır
Punith Raj

14

Uygulama tercihlerini kullanabilirsiniz. Context nesnesini ilettiğiniz sürece herhangi bir etkinlikten veya kod parçasından erişilebilirler ve bunları kullanan uygulamaya özeldirler, bu nedenle yönlendirilenle ilgilenmediğiniz sürece uygulamaya özgü değerleri gösterme konusunda endişelenmenize gerek yoktur. cihazlar. Yine de, değerleri kaydetmek için karma veya şifreleme düzenlerini kullanabilirsiniz. Ayrıca, bu tercihler bir uygulamadan diğerine çalıştırılır. İşte size bakabileceğiniz bazı kod örnekleri.


Bağlantıyı güncelledim. Proje Google Code'da barındırıldı ve bildiğimiz gibi kapatıldı. Bağlantı Github'dan.
r1k0

8

İstediğinizi başarmanın birkaç farklı yolu var.

1.) Uygulama sınıfını genişletin ve denetleyicinizi ve model nesnelerini orada başlatın.

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

}

Ardından, singleton'unuzu istediğiniz zaman özel Uygulama nesnenizden çağırabilirsiniz:

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.) Oyun kumandanızın yalnızca tek bir örnek oluşturmasını sağlayabilirsiniz:

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

Daha sonra, herhangi bir Etkinlik veya Parçadan create yöntemini çağırabilirsiniz ve henüz yoksa yeni bir denetleyici oluşturur, aksi takdirde önceden var olan denetleyiciyi döndürür.

3.) Son olarak, Square'de oluşturulan ve Android içinde bağımlılık enjeksiyonunu sağlayan kaygan bir çerçeve var. Buna Hançer denir . Burada nasıl kullanılacağına girmeyeceğim, ancak bu tür bir şeye ihtiyacınız varsa çok kaygan.

Umarım umduğun şeyi nasıl yapabileceğine dair yeterince detay verdim.


6

Şunun gibi deneyin:

Paylaşılan bir veri sınıfı oluşturun:

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



}

Verileri ayarlamak / almak istediğiniz sınıflarda global olarak bir sınıf örneği bildirildi / Initiaze ( onCreate()yöntemden önce bu kodu kullanarak ): -

Globals sharedData = Globals.getInstance();

Verileri ayarla:

sharedData.setValue("kundan");

Veri al:

String n = sharedData.getValue();

4

Bunun Global Classgibi bir şey oluşturabilirsiniz :

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

Ardından manifest'te tanımlayın:

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

Şimdi değerleri global değişkene şu şekilde ayarlayabilirsiniz:

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

Bu değerleri aşağıdaki gibi alabilirsiniz:

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

Lütfen bu blogun tam örneğini bulun Global Değişkenler


3
// 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;

1
Aynı soruya neden iki cevap gönderiyorsunuz? Bir tanesine düzenleyebilirsiniz.
Kunu

2

Benzer cevabı kontrol ettim, ama burada verilenler ihtiyaçlarıma uymuyor. Benim bakış açımdan, aradığınız şey olduğunu düşünüyorum. Mümkün olan tek kara nokta bir güvenlik meselesidir (ya da belki de değildir) çünkü güvenliği bilmiyorum.

Ben sadece gibi bir şey oluşturmak zorunda, çünkü Arayüz (sınıf yapıcı ve böylece ... kullanmanıza gerek yok) kullanmanızı öneririz:

public interface ActivityClass {

    public static final String MYSTRING_1 = "STRING";

    public static final int MYINT_1 = 1;

}

Ardından, aşağıdakileri kullanarak sınıflarınızdaki her yere erişebilirsiniz:

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

1

Teknik olarak bu soruya cevap vermiyor, ancak herhangi bir küresel değişken yerine Oda veritabanını kullanmanızı tavsiye ederim. https://developer.android.com/topic/libraries/architecture/room.html Global bir değişkeni depolamak için 'tek' ihtiyacınız olsa ve önemli değil ve ne olursa olsun, Oda veritabanını kullanmak en zarif , etkinliğin yaşam döngüsü boyunca değerleri tutmanın yerel ve iyi desteklenen bir yoludur. Özellikle verilerin bütünlüğü olmak üzere birçok sorunu önlemeye yardımcı olacaktır. Veritabanı ve global değişkenin farklı olduğunu anlıyorum ancak lütfen kod bakımı, uygulama kararlılığı ve veri bütünlüğü için Oda'yı kullanın.


1

Global değişkenleri depolamak ve almak için SharedPreferences kullanın.

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

0

Mümkünse, Çöp Toplayıcı veya İşletim Sistemi tarafından Dosyada Kaldır tarafından net olarak belirtilmemiş olan değişkenleri canlı tutmanız gerektiğini bildirmelisiniz. Bu nedenle, C / C ++ ile kod yazmalı ve .so lib dosyasına derlemelisiniz. MainActivity'nize yükleyin.


1
Yerel kod, verileri RAM'de tutmanın acı verici bir yoludur ve bunu Java staticdeğişkenlerinden daha iyi yapmaz .
Jerry101

Bu yaklaşımın amacını görmüyorum. Bu durumda bu iyi bir fikir olabilir mi?
miva2

-1
import android.app.Application;

public class Globals extends Application
{
    private static Globals instance = null;
    private static int RecentCompaignID;
    private static int EmailClick;
    private static String LoginPassword;
    static String loginMemberID;
    private static String CompaignName = "";
    private static int listget=0;
    //MailingDetails
    private static String FromEmailadd="";
    private static String FromName="";
    private static String ReplyEmailAdd="";
    private static String CompaignSubject="";
    private static int TempId=0;
    private static int ListIds=0;

    private static String HTMLContent="";
    @Override
    public void onCreate() 
    {
        super.onCreate();
        instance = this;
    }

    public static Globals getInstance()
    {
        return instance;
    }

    public void setRecentCompaignID(int objRecentCompaignID)
    {
        RecentCompaignID = objRecentCompaignID;
    }

    public int getRecentCompaignID() 
    {
        return RecentCompaignID;
    }

    public void setLoginMemberID(String objloginMemberID) 
    {
        loginMemberID = objloginMemberID;
    }

    public String getLoginMemberID() 
    {
        return loginMemberID;
    }

    public void setLoginMemberPassword(String objLoginPassword)
    {
        LoginPassword = objLoginPassword;
    }

    public String getLoginMemberPassword()
    {
        return LoginPassword;
    }

    public void setEmailclick(int id)
    {
        EmailClick = id;
    }

    public int getEmailClick() 
    {
        return EmailClick;
    }
    public void setCompaignName(String objCompaignName)
    {
        CompaignName=objCompaignName;
    }
    public String getCompaignName()
    {
        return CompaignName;
    }
    public void setlistgetvalue(int objlistget)
    {
        listget=objlistget;
    }
    public int getlistvalue()
    {
        return listget;
    }
    public void setCompaignSubject(String objCompaignSubject)
    {
         CompaignSubject=objCompaignSubject;
    }
    public String getCompaignSubject()
    {
        return CompaignSubject;
    }
    public void setHTMLContent(String objHTMLContent)
    {
        HTMLContent=objHTMLContent;
    }
    public String getHTMLContent()
    {
        return HTMLContent;
    }
    public void setListIds(int objListIds)
    {
        ListIds=objListIds;
    }
    public int getListIds()
    {
        return ListIds;
    }
    public void setReplyEmailAdd(String objReplyEmailAdd)
    {
        ReplyEmailAdd=objReplyEmailAdd;
    }
    public String getReplyEmailAdd()
    {
        return ReplyEmailAdd;
    }
    public void setFromName(String objFromName)
    {
        FromName=objFromName;
    }
    public String getFromName()
    {
        return FromName;
    }
    public void setFromEmailadd(String objFromEmailadd)
    {
        FromEmailadd=objFromEmailadd;
    }
    public String getFromEmailadd()
    {
        return FromEmailadd;
    }
}

-5

Kolay!!!!

Küresel değişken olarak erişmek istediğiniz değişken, bunları statik değişkenler olarak bildirebilirsiniz. Ve şimdi, bu değişkenlere

classname.variablename;

public class MyProperties {
private static MyProperties mInstance= null;

static int someValueIWantToKeep;

protected MyProperties(){}

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

}

MyProperites.someValueIWantToKeep;

Bu kadar! ;)


neden bu kadar çok indirildiğinden emin değilim; bazı net-upvoted cevaplar ile karşılaştırıldığında ben bu doğru (iirc) synchronizedstatik üzerinde kullanır , getInstance()ancak diğerleri değil görüyorum . buna göre oylandı.
user2297550
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.