Android वैश्विक चर


293

मैं वैश्विक वैरिएबल कैसे बना सकता हूं, एप्लिकेशन के जीवन चक्र के आसपास मूल्यों को बनाए रखें चाहे जो भी गतिविधि चल रही हो।


और क्यों हम सेट का उपयोग करें और प्राप्त करना चाहिए (जेफ गिलफेल्ट के asnwer) ?! हम सिर्फ वेरिएबल पर सीधे मान क्यों सेट करते हैं? इस तरह: सार्वजनिक वाष्पशील स्थैतिक स्ट्रिंग एक्स; और मूल्य निर्धारित करने के लिए: GeneralClass.x = मूल्य;
डॉ। अंजनी

जवाबों:


531

आप बेस android.app.Applicationक्लास का विस्तार कर सकते हैं और सदस्य चर जैसे जोड़ सकते हैं :

public class MyApplication extends Application {

    private String someVariable;

    public String getSomeVariable() {
        return someVariable;
    }

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

अपने Android मेनिफ़ेस्ट में आपको android.app.Application लागू करने वाले वर्ग की घोषणा करनी चाहिए ( android:name=".MyApplication"मौजूदा एप्लिकेशन टैग में विशेषता जोड़ें ):

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

फिर अपनी गतिविधियों में आप चर प्राप्त कर सकते हैं और सेट कर सकते हैं जैसे:

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

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

4
बहुत बढ़िया मदद, मैं सच में।
d-man

6
दुर्भाग्य से यह मेरे लिए काम नहीं कर रहा है। कृपया पुष्टि करें कि इसके बाद हम प्रकट में दो <एप्लीकेशन> टैग होंगे। सही? क्योंकि कुछ स्थानों पर मैंने लोगों को यह कहते हुए सुना कि हमें इसे मौजूदा एप्लिकेशन टैग में जोड़ना होगा। कृपया सहायता कीजिए !!
आदिल मलिक

9
@ AdilMalik आपको Android को जोड़ना होगा: मौजूदा एप्लिकेशन टैग में नाम टैग
Marijn

2
किसी संदर्भ तक पहुँचने की आवश्यकता के बिना सिर्फ सार्वजनिक स्थैतिक क्षेत्रों के साथ एक वर्ग क्यों नहीं बनाया जाए?
लाससन

51
यह सही उत्तर नहीं होना चाहिए क्योंकि इससे अनपेक्षित व्यवहार हो सकता है और मेमोरी क्लीनअप के कारण एनपीई हो सकता है। developerphil.com/dont-store-data-in-the-application-object
बकुआ

43

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

अपने आवेदन में आप इस तरह से अपने सिंगलटन का उपयोग कर सकते हैं:

MyProperties.getInstance().someValueIWantToKeep

28
यदि गतिविधि रुकी हुई है और उपयोगकर्ता ने एक और एप्लिकेशन शुरू किया है और उस दौरान मेमरी कम थी, तो एंड्रॉइड ने इस स्थिर ऑब्जेक्ट को हटा दिया जब उपयोगकर्ता ने फिर से आवेदन शुरू किया और इस स्थिर संदर्भ को शून्य पाया ???
d- आदमी

4
एक स्थैतिक अलग प्रक्रियाओं में गतिविधियों के बीच बेकार है।
एटियोब

3
यह अभ्यस्त काम अगर आपका उदाहरण कचरा एकत्र किया जाता है। तो कोड का ब्लॉक अगर (अशक्त == mInstance) {mInstance = new MyProperties (); } काम करेगा और नया उदाहरण लौटाया जाएगा, जो गुणों को रीसेट करेगा
ललित बी

1
@ मिस्टरहैड सिंगलटन बेकार नहीं है बस हमें यह जानने की जरूरत है कि सिंगलटन के अंदर क्या रखना है, अगर हम विशाल बिटमैप सरणी या कुछ संग्रह रखते हैं तो यह खतरनाक हो सकता है। इस बात का ध्यान रखें कि आप सिंगलटन के अंदर क्या रखते हैं।
ललित बी

1
मुझे पता है कि मैं थोड़ा लेट हो गया हूं, लेकिन भविष्य के पाठकों के लिए, हम साझाकरण, SQLLite डेटाबेस, या एक अतिरिक्त मेमोरी फ़ाइल में मूल्यों को संग्रहीत कर सकते हैं। यदि एप्लिकेशन बंद है, तो भी इन सभी में डेटा कायम रहेगा।
पॉवरनेट

15

यह वैश्विक चर मेरी परियोजना के लिए काम करता है:

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
लेकिन फिर आप इसे कई गतिविधियों में कैसे पास करते हैं?
Zapnologica

15
जब आवेदन निलंबित हो जाता है और डिवाइस की मेमोरी कम होती है, तो ये स्टेटिक्स (कम से कम स्ट्रिंग और एरे) एंड्रॉइड वीएम द्वारा शून्य हो सकते हैं।
एंटोन

4
@ ओमसम मुझे नहीं लगता कि स्थैतिक का सही तरीका होना चाहिए ... यदि इसकी केवल गतिविधियाँ हैं, तो यह अनुप्रयोग के संदर्भ में होना चाहिए। ऊपर दिए गए अन्य उत्तर में दिए गए तरीके से एक एकल तरीका। स्टेटिक कोड को दृढ़ता से
जोड़ेगा

14

आप अनुप्रयोग वरीयताओं का उपयोग कर सकते हैं। जब तक आप संदर्भ ऑब्जेक्ट पर पास होते हैं, तब तक वे किसी भी गतिविधि या कोड के टुकड़े से सुलभ होते हैं, और वे उस एप्लिकेशन के लिए निजी होते हैं जो उनका उपयोग करता है, इसलिए आपको एप्लिकेशन विशिष्ट मानों को उजागर करने के बारे में चिंता करने की आवश्यकता नहीं है, जब तक कि आप रूट नहीं करते हैं। उपकरण। फिर भी, आप मूल्यों को बचाने के लिए हैशिंग या एन्क्रिप्शन योजनाओं का उपयोग कर सकते हैं। इसके अलावा, इन प्राथमिकताओं को एक एप्लिकेशन रन से अगले तक संग्रहीत किया जाता है। यहाँ कुछ कोड उदाहरण हैं जिन्हें आप देख सकते हैं।


मैंने लिंक अपडेट किया है। प्रोजेक्ट को Google कोड पर होस्ट किया गया था और जैसा कि हम जानते हैं कि इसे बंद कर दिया गया था। लिंक गितुब से है।
r1k0

8

कुछ अलग-अलग तरीके हैं जो आप प्राप्त कर सकते हैं जो आप पूछ रहे हैं।

1.) एप्लिकेशन क्लास बढ़ाएँ और अपने कंट्रोलर और मॉडल ऑब्जेक्ट्स को वहाँ इंस्टेंट करें।

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

}

फिर आप किसी भी समय अपने कस्टम एप्लिकेशन ऑब्जेक्ट से अपने सिंगलटन को कॉल कर सकते हैं:

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.) आप अपने नियंत्रक सिर्फ एक एकल उदाहरण बना सकते हैं:

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

तब आप किसी भी गतिविधि या फ्रैगमेंट से बस बनाने की विधि को कॉल कर सकते हैं और यह एक नया नियंत्रक बनाएगा यदि कोई पहले से मौजूद नहीं है, अन्यथा यह preexisting नियंत्रक लौटाएगा।

3.) अंत में, स्क्वायर पर एक स्लीक फ्रेमवर्क बनाया गया है जो आपको एंड्रॉइड के भीतर निर्भरता इंजेक्शन प्रदान करता है। इसे डैगर कहा जाता है । मैं इसे यहाँ उपयोग करने के लिए नहीं जाऊँगा, लेकिन अगर आपको उस तरह की ज़रूरत है तो यह बहुत ही धीमी है।

मुझे आशा है कि मैंने इस बात के संबंध में पर्याप्त विवरण दिया है कि आप वह कैसे कर सकते हैं जिसकी आप उम्मीद कर रहे हैं।


6

इस तरह की कोशिश करें:

एक साझा डेटा वर्ग बनाएँ:

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



}

घोषित रूप से उन वर्गों में वैश्विक रूप से वर्ग का एक उदाहरण घोषित करें जहां आप डेटा सेट / प्राप्त करना चाहते हैं ( onCreate()विधि से पहले इस कोड का उपयोग करना : -

Globals sharedData = Globals.getInstance();

डेटा सेट करें:

sharedData.setValue("kundan");

डेटा प्राप्त करें:

String n = sharedData.getValue();

4

आप Global Classइस तरह बना सकते हैं :

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

फिर इसे प्रकट में परिभाषित करें:

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

अब आप इस तरह से वैश्विक वैरिएबल पर मान सेट कर सकते हैं:

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

आप उन मूल्यों को इस तरह प्राप्त कर सकते हैं:

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

कृपया इस ब्लॉग ग्लोबल वेरिएबल्स से पूरा उदाहरण प्राप्त करें


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
आप एक ही प्रश्न में दो उत्तर क्यों दे रहे हैं? आप इसे एक में संपादित कर सकते हैं।
कुनु

2

मैंने इसी तरह के उत्तर के लिए जाँच की, लेकिन यहाँ दिए गए लोग मेरी आवश्यकताओं के अनुरूप नहीं हैं। मुझे कुछ ऐसा लगता है, जो मेरे दृष्टिकोण से, वह है जो आप खोज रहे हैं। केवल संभव काला बिंदु एक सुरक्षा मामला है (या शायद नहीं) क्योंकि मुझे सुरक्षा के बारे में पता नहीं है।

मेरा सुझाव है कि इंटरफ़ेस का उपयोग करें (निर्माणकर्ता के साथ कक्षा का उपयोग करने की कोई आवश्यकता नहीं है ...), क्योंकि आपको केवल कुछ ऐसा बनाना है:

public interface ActivityClass {

    public static final String MYSTRING_1 = "STRING";

    public static final int MYINT_1 = 1;

}

फिर आप निम्नलिखित का उपयोग करके अपनी कक्षाओं में हर जगह पहुंच सकते हैं:

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

1

तकनीकी रूप से यह प्रश्न का उत्तर नहीं देता है, लेकिन मैं किसी भी वैश्विक चर के बजाय कक्ष डेटाबेस का उपयोग करने की सलाह दूंगा। https://developer.android.com/topic/lbooks/altecture/room.html भले ही आपको वैश्विक वैरिएबल को स्टोर करने के लिए 'केवल' की जरूरत हो और यह कोई बड़ी बात नहीं है और क्या नहीं, लेकिन रूम डेटाबेस का उपयोग करना सबसे सुरुचिपूर्ण है , गतिविधि के जीवन चक्र के आसपास मूल्यों को रखने के मूल और अच्छी तरह से समर्थित तरीका। यह कई मुद्दों को रोकने में मदद करेगा, विशेष रूप से डेटा की अखंडता। मैं समझता हूं कि डेटाबेस और वैश्विक चर अलग-अलग हैं, लेकिन कृपया कोड रखरखाव, ऐप स्थिरता और डेटा अखंडता के लिए कक्ष का उपयोग करें।


1

वैश्विक चर को संग्रहीत करने और पुनः प्राप्त करने के लिए SharedPreferences का उपयोग करें।

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

0

यदि संभव हो, तो आपको उन चरों को घोषित करना चाहिए जिन्हें आपको जीवित रखने की आवश्यकता है जो फ़ाइल में OS के माध्यम से कचरा कलेक्टर या अनलोड द्वारा स्पष्ट नहीं किया गया है। ऐसा करने के लिए, आपको C / C ++ द्वारा कोड करना होगा और .so lib फ़ाइल को संकलित करना होगा। इसे अपने MainActivity में लोड करें।


1
मूल कोड रैम में डेटा रखने का एक दर्दनाक तरीका है, और जावा staticचर की तुलना में बेहतर नहीं है ।
जेरी

मैं इस दृष्टिकोण का मुद्दा नहीं देखता। क्या आप विस्तार से बता सकते हैं कि यह किस मामले में एक अच्छा विचार है?
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

आसान!!!!

वे चर जिन्हें आप वैश्विक चर के रूप में उपयोग करना चाहते हैं, आप उन्हें स्थिर चर के रूप में घोषित कर सकते हैं। और अब, आप उन चर का उपयोग करके पहुँच सकते हैं

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;

बस! ;)


यकीन नहीं हो रहा था कि यह इतना नीचे क्यों गिराया गया था; कुछ अन्य नेट-अपवोट किए गए उत्तरों के साथ तुलना करने पर मुझे लगता है कि यह सही (iirc) synchronizedस्थैतिक पर उपयोग करता है getInstance()जबकि अन्य नहीं करते हैं। तदनुसार उत्थान किया।
user2297550
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.