दिलचस्प पोस्ट
किसी फ़ाइल को कैसे खोलता है इससे पहले कि वह खुलता है और तय करता है कि कौन से फ़्रेम mysql-python अधिष्ठापन त्रुटि: फ़ाइल 'config-win.h' में शामिल नहीं खोल सकता पॉइंटर्स को समझने की बाधाएं क्या हैं और उनको दूर करने के लिए क्या किया जा सकता है? एचटीटीपी क्लाइंट 4.0.1 – कनेक्शन कैसे रिलीज करना है? Memcached के बजाय मुझे मेम्केचे का उपयोग कब करना चाहिए? जावास्क्रिप्ट में ब्राउजर का पता लगाया? चयनित रेडियो पर jQuery विकल्प चुनें विकल्प (सभी ब्राउज़रों के लिए समर्थन की आवश्यकता है) साझा प्राथमिकताओं को हटा रहा है एंड्रॉइड में उपलब्ध / इंस्टॉल किए गए फोंट की सूची कैसे प्राप्त करें? CodeBehind से जावास्क्रिप्ट फ़ंक्शन को कॉल करना कई झुकाव का समर्थन करने का सबसे आसान तरीका है? जब अनुप्रयोग लैंडस्केप में होता है तो मैं कस्टम एनआईबी कैसे लोड करूँ? Log4j.properties का स्थान बदलें java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter जब सरल Struts2 अनुप्रयोग शुरू करते हैं एक SqlCommand ऑब्जेक्ट से उत्पन्न एसक्यूएल कथन प्राप्त करें? एक UICollectionView प्रोग्राम बनाना

एंड्रॉइड में वैश्विक वैरिएबल कैसे घोषित करें?

मैं एक ऐसे एप्लिकेशन का निर्माण कर रहा हूं जिसके लिए लॉगिन होना आवश्यक है। मैंने मुख्य और लॉगिन गतिविधि बनाई है

onCreate विधि पर मुख्य गतिविधि में मैंने निम्नलिखित शर्त को जोड़ा:

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ... loadSettings(); if(strSessionString == null) { login(); } ... } 

जिस onActivityResult पद्धति को निष्पादित किया जाता है, जब लॉगिन फॉर्म समाप्त होता है, तो इस प्रकार दिखता है:

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch(requestCode) { case(SHOW_SUBACTICITY_LOGIN): { if(resultCode == Activity.RESULT_OK) { strSessionString = data.getStringExtra(Login.SESSIONSTRING); connectionAvailable = true; strUsername = data.getStringExtra(Login.USERNAME); } } } 

समस्या यह है कि प्रवेश प्रपत्र कभी-कभी दो बार प्रकट होता है ( login() विधि को दो बार कहा जाता है) और जब फोन कुंजीपटल लॉगिन फ़ॉर्म को फिर से स्लाइड करता है और मुझे लगता है कि समस्या चर strSessionString

क्या किसी को पता है कि उपयोगकर्ता पहले से ही सफलतापूर्वक प्रमाणित होने के बाद प्रवेश फार्म से बचने के लिए चर वैश्विक कैसे सेट करें?

वेब के समाधान से एकत्रित समाधान "एंड्रॉइड में वैश्विक वैरिएबल कैसे घोषित करें?"

मैंने यह जवाब वापस '0 9 में लिखा था, जब एंड्रॉइड अपेक्षाकृत नया था, और एंड्रॉइड डेवलपमेंट में बहुत से स्थापित नहीं हुए थे। मैंने इस पोस्ट के निचले हिस्से में एक लंबी परिशिष्ट जोड़ दिया है, कुछ आलोचनाओं को संबोधित करते हुए, और दार्शनिक असहमति के बारे में बताए हुए है, जिसमें उप-क्लासिंग अनुप्रयोग के बजाय सिंगलाटन्स के उपयोग के साथ है I इसे अपने जोखिम पर पढ़ें

मूल उत्तर:

आप जितनी अधिक सामान्य समस्याएं आ रहे हैं, उतनी क्रियाएं और आपके आवेदन के सभी हिस्सों में राज्य को कैसे बचाया जाए। एक स्थिर चर (उदाहरण के लिए, सिंगलटन) यह प्राप्त करने का एक सामान्य जावा तरीका है। मुझे हालांकि पता चला है कि एंड्रॉइड में एक और शानदार तरीका आपके राज्य को एप्लिकेशन संदर्भ से संबद्ध करना है।

जैसा कि आप जानते हैं, प्रत्येक गतिविधि एक संदर्भ भी है, जो कि इसके निष्पादन परिवेश के बारे में विस्तृत जानकारी है। आपके आवेदन का भी एक संदर्भ है, और एंड्रॉइड गारंटी देता है कि यह आपके आवेदन में एक उदाहरण के रूप में मौजूद होगा।

ऐसा करने का तरीका एंड्रॉइड के अपने उप-वर्ग को बनाने के लिए है। App.एप्लिकेशन, और उसके बाद अपने मैनिफेस्ट में एप्लिकेशन टैग में उस वर्ग को निर्दिष्ट करें। अब एंड्रॉइड स्वचालित रूप से उस क्लास का एक उदाहरण बना देगा और इसे अपने पूरे एप्लिकेशन के लिए उपलब्ध कराएगा। आप इसे context Context.getApplicationContext() विधि का उपयोग करते हुए किसी भी context से एक्सेस कर सकते हैं ( Activity भी एक विधि getApplication() करती है जिसका सटीक प्रभाव होता है)। निम्नलिखित अत्यंत सरल उदाहरण हैं, जिनके अनुसरण करने के लिए चेतावनियां हैं:

 class MyApp extends Application { private String myState; public String getState(){ return myState; } public void setState(String s){ myState = s; } } class Blah extends Activity { @Override public void onCreate(Bundle b){ ... MyApp appState = ((MyApp)getApplicationContext()); String state = appState.getState(); ... } } 

यह अनिवार्य रूप से एक स्थिर वैरिएबल या सिंगलटन का उपयोग करने के रूप में एक ही प्रभाव है, लेकिन मौजूदा एंड्रॉइड फ़्रेमवर्क में काफी अच्छी तरह से एकीकृत करता है। ध्यान दें कि यह प्रक्रियाओं में काम नहीं करेगा (आपके ऐप को दुर्लभ लोगों में से एक होना चाहिए जिनके पास एकाधिक प्रक्रियाएं हैं)।

ऊपर दिए गए उदाहरण से कुछ ध्यान दें; मान लीजिए हम इसके बदले कुछ किया था:

 class MyApp extends Application { private String myState = /* complicated and slow initialization */; public String getState(){ return myState; } } 

अब यह धीमी गति से शुरूआत (जैसे कि डिस्क को मारने, नेटवर्क से टकराने, कुछ अवरुद्ध करना आदि) हर बार किया जायेगा आवेदन तत्काल! आप सोच सकते हैं, ठीक है, यह प्रक्रिया के लिए केवल एक बार है और मुझे वैसे भी लागत का भुगतान करना होगा, है ना? उदाहरण के लिए, जैसा कि डियान हैकबॉर्न नीचे उल्लिखित है, आपकी प्रक्रिया को तुरंत शुरू करने के लिए – पृष्ठभूमि-प्रसारण कार्यक्रम को संभालने के लिए पूरी तरह से संभव है। यदि आपके प्रसारण प्रसंस्करण के लिए इस स्थिति की कोई आवश्यकता नहीं है, तो आपने संभावित रूप से कुछ भी नहीं के लिए जटिल और धीमी गति से संचालन की पूरी श्रृंखला पूरी कर ली है। आलसी तत्काल खेल का नाम यहाँ है। निम्नलिखित अनुप्रयोग का उपयोग करने का थोड़ा और अधिक जटिल तरीका है जो कुछ के लिए और अधिक समझ में आता है, लेकिन उपयोग में सबसे आसान है:

 class MyApp extends Application { private MyStateManager myStateManager = new MyStateManager(); public MyStateManager getStateManager(){ return myStateManager ; } } class MyStateManager { MyStateManager() { /* this should be fast */ } String getState() { /* if necessary, perform blocking calls here */ /* make sure to deal with any multithreading/synchronicity issues */ ... return state; } } class Blah extends Activity { @Override public void onCreate(Bundle b){ ... MyStateManager stateManager = ((MyApp)getApplicationContext()).getStateManager(); String state = stateManager.getState(); ... } } 

जब मैं ऐप्लिकेटिंग ऐप्लिकेशंस को पसंद करता हूं, तो ऐप्लकेशन उप-क्लास के साथ राज्य को जोड़ने के कई प्रभावों और मल्टीथ्रेडिंग के प्रभाव के बारे में सोचने पर अधिक से अधिक नहीं समझने पर, मैं डेवलपर्स का इस्तेमाल करना चाहता हूं।

नोट 1: एंटाकेफ़ के रूप में भी टिप्पणी की गई है, ताकि सही तरीके से अपना आवेदन टाई करने के लिए आपके एप्लिकेशन को ओवरराइड किया जा सके, मैनिफेस्ट फ़ाइल में एक टैग आवश्यक हो। दोबारा, अधिक जानकारी के लिए एंड्रॉइड डॉक्स देखें। एक उदाहरण:

 <application android:name="my.application.MyApp" android:icon="..." android:label="..."> </application> 

नोट 2: उपयोगकर्ता 608578 पूछता है कि यह देशी ऑब्जेक्ट जीवनशैली के प्रबंधन के साथ कैसे काम करता है। मैं एंड्रॉइड के साथ थोड़े ही समय में देशी कोड का इस्तेमाल करने में तेजी लाने के लिए तैयार नहीं हूं, और मैं जवाब देने के लिए योग्य नहीं हूं कि वह मेरे समाधान के साथ कैसे बातचीत करेगा। अगर किसी व्यक्ति का इसका उत्तर है, तो मैं उन्हें क्रेडिट करने के लिए तैयार हूं और इस पोस्ट में अधिकतम दृश्यता के लिए जानकारी डाल रहा हूं।

परिशिष्ट:

जैसा कि कुछ लोगों ने उल्लेख किया है, यह लगातार राज्य के लिए एक समाधान नहीं है, मुझे शायद मूल उत्तर में अधिक बल देना चाहिए था। Ie यह प्रयोक्ता या अन्य जानकारी को सहेजने का एक समाधान नहीं है जिसका मतलब है कि आवेदन जीवनकाल में कायम रहना चाहिए। इस प्रकार, मैं किसी भी समय मारे गए आवेदनों से संबंधित अधिकांश आलोचनाओं को मानता हूँ … आदि, मुनाफा, जो कुछ भी डिस्क पर कायम रखने की आवश्यकता होती है, उन्हें किसी अनुप्रयोग उपवर्ग के माध्यम से संग्रहीत नहीं किया जाना चाहिए। यह अस्थायी, आसानी से पुन: रचनायोग्य अनुप्रयोग स्थिति (चाहे उपयोगकर्ता को उदाहरण के लिए लॉग ऑन किया गया है) और घटकों जो एक उदाहरण (उदाहरण के लिए एप्लिकेशन नेटवर्क मैनेजर) (नॉन सिंगलटन!) प्रकृति में संग्रहीत करने का समाधान होने का मतलब है

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

डियान कहते हैं, "आवेदन से उप-कक्षा का कोई कारण नहीं है। यह सिंगलटन बनाने से अलग नहीं है …" यह पहला दावा गलत है। इसके दो मुख्य कारण हैं। 1) एप्लिकेशन क्लास एक एप्लिकेशन डेवलपर के लिए एक बेहतर जीवन भर गारंटी प्रदान करता है; यह आवेदन के आजीवन होने की गारंटी है। एक सिंगलटन को आवेदन के जीवनकाल से जुड़ा नहीं है (हालांकि यह प्रभावी है)। यह आपके औसत ऐप्लीकेशन डेवलपर के लिए एक गैर-मुद्दा हो सकता है, लेकिन मैं तर्क देता हूं कि यह वास्तव में अनुबंध का प्रकार है जो एंड्रॉइड एपीआई की पेशकश करनी चाहिए, और यह एंड्रॉइड सिस्टम को अधिक लचीलापन प्रदान करता है, साथ ही जुड़े हुए जीवनकाल को कम करके डेटा। 2) आवेदन वर्ग राज्य के लिए एक उदाहरण धारक के साथ आवेदन डेवलपर प्रदान करता है, जो कि राज्य के सिंगलटन धारक से बहुत अलग है। मतभेदों की एक सूची के लिए, ऊपर सिंगलटन स्पष्टीकरण लिंक देखें।

डियान जारी है, "… आपको भविष्य में कुछ पछतावा होने की संभावना है, जैसा कि आप अपने एप्लिकेशन ऑब्जेक्ट को इस बड़े पेचीदा गड़बड़ को समझते हैं कि स्वतंत्र एप्लिकेशन तर्क क्या होना चाहिए।" यह निश्चित रूप से गलत नहीं है, लेकिन यह अनुप्रयोग उप-वर्ग पर सिंगलटन को चुनने का कोई कारण नहीं है। डायने के तर्कों में से कोई भी एक कारण प्रदान नहीं करता है कि एक सिंगलटन का उपयोग करना एक अनुप्रयोग उप-वर्ग से बेहतर होता है, वह सभी को स्थापित करने की कोशिश करता है कि सिंगलटन का उपयोग करना एक अनुप्रयोग उप-वर्ग से भी बुरा नहीं है, जो मुझे विश्वास है कि वह गलत है।

वह जारी रखती है, "और यह स्वाभाविक रूप से आगे बढ़ती है कि आप इन चीजों को कैसे प्रबंधित करना चाहिए – मांग पर उन्हें आरंभ करना।" यह इस तथ्य की उपेक्षा करता है कि कोई कारण नहीं है कि आप एक आवेदन उप-कक्षा का उपयोग करके भी मांग पर प्रारंभ नहीं कर सकते। फिर कोई अंतर नहीं है

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

डियान ने नीचे टिप्पणी की है, आवेदन उप-वर्गों का उपयोग करने के लिए एक अतिरिक्त नकारात्मकता का उल्लेख करते हुए, वे कम प्रदर्शन कोड लिखने में प्रोत्साहित या आसान बना सकते हैं। यह बहुत सच्चा है, और मैंने इस जवाब को संपादित किया है, यहां पर विचार करने के महत्व को जोर देने के लिए, और यदि आप अनुप्रयोग उप-क्लासिंग का उपयोग कर रहे हैं तो सही दृष्टिकोण लेना है। Dianne राज्यों के रूप में, यह याद रखना महत्वपूर्ण है कि आपका आवेदन क्लास हर बार आपकी प्रक्रिया लोड हो जाएगा (एक बार में कई बार हो सकता है यदि आपका एप्लिकेशन कई प्रक्रियाओं में चलता है!) भले ही प्रक्रिया केवल पृष्ठभूमि के प्रसारण के लिए लोड हो रही है घटना। इसलिए किसी भी प्रसंस्करण के लिए एक जगह के बजाय आपके आवेदन के साझा किए गए घटकों के लिए संकेतक के लिए एक रिपॉजिटरी के रूप में आवेदन वर्ग का उपयोग करना महत्वपूर्ण है!

मैं आपको सिग्लाटन्स को डाउनसाइड्स की निम्न सूची के साथ छोड़ देता हूं, जैसा कि पहले स्टैकएक्सchange लिंक से चोरी हो गया है:

  • सार या इंटरफ़ेस वर्गों का उपयोग करने में असमर्थता;
  • उपवर्ग को अक्षमता;
  • आवेदन भर में उच्च युग्मन (संशोधित करना मुश्किल);
  • परीक्षण करने के लिए मुश्किल (इकाई परीक्षणों में नकली / नकली नहीं कर सकते हैं);
  • अस्थिर राज्य के मामले में समानांतर करने के लिए मुश्किल (व्यापक लॉकिंग की आवश्यकता है);

और अपना खुद का जोड़ें:

  • एंड्रॉइड (या अधिकांश अन्य) विकास के लिए अनुपचारित अस्पष्ट और असहनीय जीवनकाल अनुबंध;

इस उपवर्ग को बनाएं

 public class MyApp extends Application { String foo; } 

AndroidManifest.xml में एंड्रॉइड जोड़ें: नाम

उदाहरण

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

आवेदन के लिए राज्य को रखने का स्वानिल तरीका अच्छा है, हालांकि यह एक कमजोर बिंदु है – ऐसे मामलों हैं जब ओएस पूरी आवेदन प्रक्रिया को मारता है यहां इस पर दस्तावेज़ीकरण है – प्रक्रियाएं और जीवनशैली

किसी मामले पर विचार करें – आपका ऐप पृष्ठभूमि में जाता है क्योंकि कोई आपको कॉल कर रहा है (फ़ोन ऐप अब अग्रभूमि में है)। इस मामले में && कुछ अन्य परिस्थितियों में (उपरोक्त लिंक की जांच करें कि वे क्या हो सकते हैं) ओएस आपकी उपयोक्ता प्रक्रिया को नष्ट कर सकता है, जिसमें उप-उपखंड उदाहरण भी शामिल है। परिणामस्वरूप राज्य खो जाता है। जब आप बाद में आवेदन पर वापस लौटते हैं, तो ओएस अपनी गतिविधि स्टैक और Application उप-क्लास इंस्टेंस को पुनर्स्थापित करेगा, हालांकि myState फील्ड null हो जाएगा।

एएपीएआईके, राज्य की सुरक्षा की गारंटी का एकमात्र तरीका है राज्य को जारी रखने के किसी भी प्रकार का उपयोग करना, उदाहरण के लिए एक निजी फाइल का उपयोग करके आवेदन फाइल या SharedPrefernces (यह अंततः आंतरिक फ़ाइल सिस्टम में एप्लिकेशन फ़ाइल के लिए निजी उपयोग करता है)

सिर्फ एक नोट ..

जोड़ें:

 android:name=".Globals" 

या जो भी आपने अपने उपवर्ग को मौजूदा <application> टैग पर रखा है। मैं मैनिफेस्ट को एक और <application> टैग जोड़ने की कोशिश कर रहा था और एक अपवाद प्राप्त होगा।

मैं ऐप्लिकेशन टैग को कैसे निर्दिष्ट कर सकता हूं या नहीं, लेकिन बहुत सारे Googling के बाद, यह मैनिफ़ेस्ट फाइल डॉक्स से स्पष्ट हो गया: एंड्रॉइड का उपयोग करें: नाम, डिफ़ॉल्ट आइकन के अतिरिक्त और एप्लिकेशन स्टांज़ा में लेबल।

एंड्रॉइड: नाम एप्लिकेशन के लिए कार्यान्वित एक उप-उप-आवेदन के पूर्णतः योग्य नाम। जब आवेदन की प्रक्रिया शुरू की जाती है, तो इस श्रेणी को किसी भी अनुप्रयोग के घटकों से पहले इंस्टाल्ट किया जाता है।

उपवर्ग वैकल्पिक है; अधिकांश अनुप्रयोगों को एक की आवश्यकता नहीं होगी उप-वर्ग की अनुपस्थिति में, एंड्रॉइड आधार एप्लिकेशन क्लास का एक उदाहरण का उपयोग करता है

ऐसी वैश्विक संरचनाओं के साथ मूल स्मृति का संग्रह सुनिश्चित करने के बारे में क्या?

क्रियाकलापों में एक onPause/onDestroy() विधि है जिसे विनाश कहा जाता है, लेकिन onPause/onDestroy() कक्षा के पास कोई समतुल्य नहीं है। यह सुनिश्चित करने के लिए कि कौन से तंत्र की सिफारिश की जाती है, जो कि वैश्विक संरचनाएं (विशेषकर उन लोगों को मूल स्मृति में संदर्भ वाले) कचरा एकत्र किए जाते हैं, जब आवेदन को या तो मार दिया जाता है या पृष्ठभूमि में टास्क स्टैक रखा जाता है?

बस आप नीचे एक आवेदन नाम परिभाषित करने की आवश्यकता है जो काम करेगा:

 <application android:name="ApplicationName" android:icon="@drawable/icon"> </application> 

जैसे ओएस से ऊपर चर्चा हुई थी, किसी भी अधिसूचना के बिना आवेदन को मार सकता है (कोई भी डेस्टोरय घटना नहीं है) तो इन वैश्विक चर को बचाने का कोई तरीका नहीं है।

साझा किए गए संदर्भ एक समाधान हो सकते हैं, लेकिन आपके पास परिसर स्ट्रक्चरर्ड वैरिएबल (मेरे मामले में मेरे पास आईडी को स्टोर करने के लिए पूर्णांक सरणी थी जो उपयोगकर्ता पहले ही संभाला है)। साझा किए गए संदर्भों के साथ समस्या यह है कि मूल्यों की आवश्यकता होती है जब प्रत्येक बार इन संरचनाओं को संग्रहित और पुनः प्राप्त करना कठिन होता है।

मेरे मामले में मेरे पास एक पृष्ठभूमि सेवा थी, इसलिए मैं इस चर को वहां ले जा सकूं और क्योंकि सेवा में डिस्टोर घटना है, मैं उन मूल्यों को आसानी से बचा सकता हूं

यदि कुछ चर SQL में संग्रहीत हैं और आपको उन्हें अपने ऐप की अधिकांश गतिविधियों में उपयोग करना होगा। तो आवेदन संभवतः इसे प्राप्त करने का सबसे अच्छा तरीका है। डेटाबेस से वेरिएबल्स की क्वेरी करें, जब आवेदन प्रारंभ हो और उन्हें किसी फ़ील्ड में संग्रहीत करें। तब आप अपनी गतिविधियों में इन चर का उपयोग कर सकते हैं

तो सही तरीके से मिलें, और कोई सर्वोत्तम तरीका नहीं है

इस प्रकार की राज्य को स्टोर करने के लिए आपके पास एक स्थिर क्षेत्र हो सकता है। या इसे संसाधन बंडल में डाल दिया और वहां से क्र्रीट पर (बंडल सहेजे गए इन्स्टेंसस्टेट) पुनर्स्थापित करें। बस सुनिश्चित करें कि आप एंड्रॉइड ऐप प्रबंधित जीवनचक्र को पूरी तरह से समझते हैं (उदाहरण के लिए क्यों लॉगिन () कुंजीपटल ओरिएंटेशन परिवर्तन पर कॉल किया जाता है)।

मैनिफ़ेस्ट फ़ाइल में किसी अन्य <application> टैग का उपयोग करें। बस मौजूदा <application> टैग में एक परिवर्तन करें, इस लाइन android:name=".ApplicationName" जोड़ें android:name=".ApplicationName" जहां, ApplicationName आपके उपवर्ग का नाम होगा (वैश्विक स्टोर करने के लिए उपयोग करें ) कि, आप बनाने के बारे में है

इसलिए, अंत में मैनिफ़ेस्ट फ़ाइल में आपका एक और केवल <application> टैग इस तरह दिखना चाहिए: –

 <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/Theme.AppCompat.NoActionBar" android:name=".ApplicationName" > 

आप इसे दो तरीकों से प्रयोग कर सकते हैं:

  1. अनुप्रयोग वर्ग का उपयोग करना
  2. साझा वरीयताओं का उपयोग करना

  3. अनुप्रयोग वर्ग का उपयोग करना

उदाहरण:

 class SessionManager extends Application{ String sessionKey; setSessionKey(String key){ this.sessionKey=key; } String getSessisonKey(){ return this.sessionKey; } } 

आप नीचे अपने मुख्य गतिविधि में प्रवेश को लागू करने के लिए ऊपर वर्ग का उपयोग कर सकते हैं। कोड कुछ ऐसा दिखाई देगा:

 @override public void onCreate (Bundle savedInstanceState){ // you will this key when first time login is successful. SessionManager session= (SessionManager)getApplicationContext(); String key=getSessisonKey.getKey(); //Use this key to identify whether session is alive or not. } 

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

  1. साझा प्राथमिकताओं का उपयोग करना

     String MYPREF="com.your.application.session" SharedPreferences pref= context.getSharedPreferences(MyPREF,MODE_PRIVATE); //Insert key as below: Editot editor= pref.edit(); editor.putString("key","value"); editor.commit(); //Get key as below. SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); String key= getResources().getString("key"); 

आप इंटेंट्स, एसक्लाइट या साझा प्राथमिकताओं का उपयोग कर सकते हैं जब मीडिया भंडारण की बात आती है, जैसे दस्तावेज़, फ़ोटो और वीडियो, तो आप नई फ़ाइलों को इसके बजाय बना सकते हैं।

गतिविधि के परिणाम पर फिर से शुरू होने पर कहा जाता है तो फिर आप फिर से शुरू करने के लिए चेक इन लॉगिन करें और अपने दूसरे लॉगिन को बंद कर दिया जा सकता है जब एक बार सीक्वॉम गतिविधि ने सकारात्मक परिणाम वापस कर दिया है। फिर से शुरू हर बार कहा जाता है, इसलिए इसमें चिंता नहीं की जा रही है कि इसे पहली बार नहीं कहा जा रहा है।

उप-क्लासिंग के दृष्टिकोण का उपयोग बारकास ढांचे द्वारा भी किया गया है। मेरे दृष्टिकोण के उप-क्लासेसिंग एप्लिकेशन से एंड्रॉइड की जीवनशैली के साथ काम करने का इरादा था; यह वही है जो किसी भी अनुप्रयोग कंटेनर करता है इसके बाद ग्लोबल्स होने के बजाय, मैं इस संदर्भ में सेम पंजीकृत करता हूं, उन्हें किसी संदर्भ में संदर्भित किसी भी श्रेणी में इंजेक्शन लगाने का मौका देता है। हर इंजेक्शन बीन उदाहरण वास्तव में एक सिंगलटन है

विवरण के लिए यह उदाहरण देखें

यदि आप इतना अधिक हो सकता है, तो मैनुअल काम क्यों करते हैं?

 class GlobaleVariableDemo extends Application { private String myGlobalState; public String getGlobalState(){ return myGlobalState; } public void setGlobalState(String s){ myGlobalState = s; } } class Demo extends Activity { @Override public void onCreate(Bundle b){ ... GlobaleVariableDemo appState = ((GlobaleVariableDemo)getApplicationContext()); String state = appState.getGlobalState(); ... } } 

आप एक ऐसा वर्ग बना सकते हैं जो Application क्लास का विस्तार करता है और फिर उस चर के क्षेत्र के रूप में अपना वैरिएबल घोषित करता है और उसके लिए गेटर विधि प्रदान करता है।

 public class MyApplication extends Application { private String str = "My String"; synchronized public String getMyString { return str; } } 

और फिर अपनी गतिविधि में उस चर तक पहुंचने के लिए, इसका उपयोग करें:

 MyApplication application = (MyApplication) getApplication(); String myVar = application.getMyString();