एक विस्तारित Application
वर्ग वैश्विक चर घोषित कर सकता है। क्या अन्य कारण हैं?
एक विस्तारित Application
वर्ग वैश्विक चर घोषित कर सकता है। क्या अन्य कारण हैं?
जवाबों:
ऑफहैंड, मैं एक वास्तविक परिदृश्य के बारे में नहीं सोच सकता जिसमें आवेदन का विस्तार किसी अन्य दृष्टिकोण के लिए बेहतर हो या कुछ हासिल करने के लिए आवश्यक हो। यदि आपके पास एक महंगी, अक्सर उपयोग की जाने वाली वस्तु है, तो आप इसे IntentService में आरंभीकृत कर सकते हैं जब आप पाते हैं कि वस्तु वर्तमान में मौजूद नहीं है। अनुप्रयोग स्वयं UI थ्रेड पर चलता है, जबकि IntentService अपने स्वयं के थ्रेड पर चलता है।
मैं स्पष्ट इरादों के साथ गतिविधि से गतिविधि तक डेटा पास करना पसंद करता हूं, या साझाकरण का उपयोग करता हूं। इंटरफेस का उपयोग करके किसी फ्रैगमेंट से इसकी पैरेंट एक्टिविटी तक डेटा पास करने के भी तरीके हैं।
"prefer to pass data from Activity to Activity with explicit Intents, or use SharedPreferences"
। हमें हमेशा वैश्विक स्थिति को समाप्त करना चाहिए जितना हम कर सकते हैं और स्थिर स्टेट्स /
apk
अपने मोबाइल में एक फ़ाइल पर विचार करते हैं , तो यह कई उपयोगी ब्लॉकों से मिलकर बनता है, जैसे कि, Activity
s, Service
s और अन्य।Application
की परवाह किए बिना पूरे राज्य में Activity
इसका उपयोग किया जाता है:Application
,Cursor
इसे बनाने और इसे फिर से बंद करने और प्रदर्शन पर अच्छा नहीं है,Intent
डेटा को पास करने के लिए s का उपयोग कर सकते हैं लेकिन यह अनाड़ी है और स्मृति-उपलब्धता के आधार पर गतिविधि निश्चित रूप से मौजूद नहीं हो सकती है।Application
,Application
एनालिटिक्स आदि जैसी कुछ चीजों को शुरू करने के लिए आप उपयोग कर सकते हैं क्योंकि एप्लिकेशन क्लास शुरू होने से पहले शुरू हो जाती है Activity
या
Services
चलाया जा रहा है,एप्लिकेशन क्लास वह ऑब्जेक्ट है जिसमें आपके एप्लिकेशन का पूरा जीवनचक्र होता है। यह एक एप्लिकेशन के रूप में आपकी उच्चतम परत है। उदाहरण संभव उपयोग:
आप अनुप्रयोग वर्ग में onCreate को ओवरराइड करके शुरू करने पर आपको जो कुछ भी ज़रूरत है उसे जोड़ सकते हैं।
वैश्विक चर कि गतिविधि से गतिविधि के लिए कूद। एसिंक्टस्क की तरह।
आदि
कभी-कभी आप डेटा को संग्रहित करना चाहते हैं, जैसे वैश्विक चर जिन्हें कई गतिविधियों से एक्सेस करने की आवश्यकता होती है - कभी-कभी एप्लिकेशन के भीतर हर जगह। इस मामले में, एप्लिकेशन ऑब्जेक्ट आपकी सहायता करेगा।
उदाहरण के लिए, यदि आप प्रत्येक HTTP अनुरोध के लिए मूल प्रमाणीकरण डेटा प्राप्त करना चाहते हैं, तो आप एप्लिकेशन ऑब्जेक्ट में प्रमाणीकरण डेटा के लिए तरीकों को लागू कर सकते हैं।
इसके बाद, आप इस तरह की किसी भी गतिविधि में उपयोगकर्ता नाम और पासवर्ड प्राप्त कर सकते हैं:
MyApplication mApplication = (MyApplication)getApplicationContext();
String username = mApplication.getUsername();
String password = mApplication.getPassword();
और अंत में, एप्लिकेशन ऑब्जेक्ट को सिंगलटन ऑब्जेक्ट के रूप में उपयोग करना याद रखें:
public class MyApplication extends Application {
private static MyApplication singleton;
public MyApplication getInstance(){
return singleton;
}
@Override
public void onCreate() {
super.onCreate();
singleton = this;
}
}
अधिक जानकारी के लिए, कृपया आवेदन वर्ग पर क्लिक करें
एप्लिकेशन क्लास एक सिंगलटन है जिसे आप किसी भी गतिविधि से एक्सेस कर सकते हैं या कहीं और भी आपके पास एक कॉनटेक्स्ट ऑब्जेक्ट हो सकता है।
आपको थोड़ा सा जीवनचक्र भी मिलता है।
आप महंगे इंस्टेंट करने के लिए एप्लिकेशन की ऑनक्रिएट विधि का उपयोग कर सकते हैं, लेकिन अक्सर एक विश्लेषिकी सहायक जैसी वस्तुओं का उपयोग किया जाता है। तब आप उन वस्तुओं का उपयोग और उपयोग हर जगह कर सकते हैं।
आवेदन वर्ग का सबसे अच्छा उपयोग। उदाहरण: मान लीजिए कि आपको अपने अलार्म मैनेजर को बूट पर पूरा करने की आवश्यकता है।
public class BaseJuiceApplication extends Application implements BootListener {
public static BaseJuiceApplication instance = null;
public static Context getInstance() {
if (null == instance) {
instance = new BaseJuiceApplication();
}
return instance;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onBootCompleted(Context context, Intent intent) {
new PushService().scheduleService(getInstance());
//startToNotify(context);
}
एक उत्तर नहीं बल्कि एक अवलोकन : ध्यान रखें कि विस्तारित एप्लिकेशन ऑब्जेक्ट में डेटा को किसी गतिविधि के उदाहरण से नहीं बांधा जाना चाहिए, क्योंकि यह संभव है कि आपके पास एक ही समय में चलने वाली एक ही गतिविधि के दो उदाहरण हों (एक में अग्रभूमि और एक दिखाई नहीं दे रहा है) ।
उदाहरण के लिए, आप सामान्य रूप से लॉन्चर के माध्यम से अपनी गतिविधि शुरू करते हैं, फिर इसे "कम से कम" करें। फिर आप एक और ऐप शुरू करते हैं (यानी टास्कर) जो आपकी सक्रियता का एक और उदाहरण शुरू करता है, उदाहरण के लिए शॉर्टकट बनाने के लिए, क्योंकि आपका ऐप android.intent.action.CREATE_SHORTCUT का समर्थन करता है। यदि शॉर्टकट तब बनाया गया है और गतिविधि के इस शॉर्टकट-बनाने वाले आह्वान ने डेटा को एप्लिकेशन ऑब्जेक्ट को संशोधित किया है, तो बैकग्राउंड में वापस लाए जाने के बाद पृष्ठभूमि में चल रही गतिविधि इस संशोधित एप्लिकेशन ऑब्जेक्ट का उपयोग करना शुरू कर देगी।
मैं देखता हूं कि इस सवाल का जवाब याद आ रहा है। मैं विस्तार करता हूं Application
क्योंकि मैं बिल पुग सिंग्लटन कार्यान्वयन ( संदर्भ देखें ) का उपयोग करता हूं और मेरे कुछ सिंग्लेटन्स को संदर्भ की आवश्यकता है। Application
इस तरह वर्ग दिखता है:
public class MyApplication extends Application {
private static final String TAG = MyApplication.class.getSimpleName();
private static MyApplication sInstance;
@Contract(pure = true)
@Nullable
public static Context getAppContext() {
return sInstance;
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate() called");
sInstance = this;
}
}
और एकल इस तरह दिखते हैं:
public class DataManager {
private static final String TAG = DataManager.class.getSimpleName();
@Contract(pure = true)
public static DataManager getInstance() {
return InstanceHolder.INSTANCE;
}
private DataManager() {
doStuffRequiringContext(MyApplication.getAppContext());
}
private static final class InstanceHolder {
@SuppressLint("StaticFieldLeak")
private static final DataManager INSTANCE = new DataManager();
}
}
इस तरह मुझे हर बार एक संदर्भ का उपयोग करने की आवश्यकता नहीं है और मैं एक सिंगलटन का उपयोग कर रहा हूं और कोड की न्यूनतम राशि के साथ आलसी सिंक्रनाइज़ आरंभिक प्राप्त कर सकता हूं।
टिप: एंड्रॉइड स्टूडियो सिंगलटन टेम्प्लेट को अपडेट करने से बहुत समय बचता है।
मुझे लगता है कि आप कई चीजों के लिए एप्लिकेशन क्लास का उपयोग कर सकते हैं, लेकिन वे सभी आपकी जरूरतों के लिए बंधे हुए हैं कुछ भी करने से पहले आपकी कोई भी गतिविधि या सेवा शुरू नहीं की जाती है। उदाहरण के लिए, मेरे आवेदन में मैं कस्टम फोंट का उपयोग करता हूं। फोन करने के बजाय
Typeface.createFromAsset()
एसेट्स फ़ोल्डर से मेरे फोंट के लिए संदर्भ प्राप्त करने के लिए हर गतिविधि से (यह बुरा है क्योंकि यह मेमोरी लीक में परिणाम देगा क्योंकि आप हर बार जब आप उस पद्धति को कॉल करते हैं तो संपत्ति का संदर्भ रखते हैं), मैं onCreate()
अपने आवेदन वर्ग में विधि से ऐसा करता हूं :
private App appInstance;
Typeface quickSandRegular;
...
public void onCreate() {
super.onCreate();
appInstance = this;
quicksandRegular = Typeface.createFromAsset(getApplicationContext().getAssets(),
"fonts/Quicksand-Regular.otf");
...
}
अब, मेरे पास इस तरह से परिभाषित एक विधि भी है:
public static App getAppInstance() {
return appInstance;
}
और इस:
public Typeface getQuickSandRegular() {
return quicksandRegular;
}
तो, मेरे आवेदन में कहीं से भी, मुझे केवल इतना करना है:
App.getAppInstance().getQuickSandRegular()
मेरे लिए एप्लिकेशन क्लास के लिए एक और उपयोग यह जांचने के लिए है कि क्या डिवाइस इंटरनेट से जुड़ी गतिविधियों और सेवाओं से जुड़ा है, जिनके लिए कनेक्शन की आवश्यकता होती है, वास्तव में शुरू करते हैं और आवश्यक कार्रवाई करते हैं।
स्रोत: https://github.com/codepath/android_guides/wiki/Understanding-the-Android-Application-Class
कई ऐप में, एप्लिकेशन क्लास के साथ सीधे काम करने की कोई आवश्यकता नहीं है। हालाँकि, कस्टम अनुप्रयोग वर्ग के कुछ स्वीकार्य उपयोग हैं:
- विशिष्ट कार्य जिन्हें आपकी पहली गतिविधि के निर्माण से पहले चलाने की आवश्यकता है
- सभी घटकों (क्रैश रिपोर्टिंग, दृढ़ता) में वैश्विक आरंभीकरण को साझा करने की आवश्यकता है
- स्थैतिक अपरिवर्तनीय डेटा जैसे साझा नेटवर्क क्लाइंट ऑब्जेक्ट तक आसान पहुंच के लिए स्टेटिक तरीके
आपको एप्लिकेशन ऑब्जेक्ट के अंदर कभी भी म्यूटेबल इंस्टेंस डेटा को स्टोर नहीं करना चाहिए क्योंकि यदि आप मानते हैं कि आपका डेटा वहां रहेगा, तो आपका एप्लिकेशन NullPointerException के साथ किसी बिंदु पर अनिवार्य रूप से क्रैश हो जाएगा। एप्लिकेशन ऑब्जेक्ट को हमेशा के लिए मेमोरी में रहने की गारंटी नहीं है, यह मारा जाएगा। आम धारणा के विपरीत, ऐप को स्क्रैच से रीस्टार्ट नहीं किया जाएगा। एंड्रॉइड एक नया एप्लिकेशन ऑब्जेक्ट बनाएगा और उस गतिविधि को शुरू करेगा जहां उपयोगकर्ता यह भ्रम देने से पहले था कि एप्लिकेशन को पहले स्थान पर कभी नहीं मारा गया था।
विस्तृत अनुप्रयोग का उपयोग आपके आवेदन को किसी भी प्रकार के संचालन के लिए सुनिश्चित करता है जो आप अपने आवेदन पत्र की अवधि के दौरान चाहते हैं। अब यह किसी भी प्रकार का हो सकता है और मान लें कि यदि आप सर्वर से कुछ डेटा प्राप्त करना चाहते हैं, तो आप अपने एसिंक्टस्क को आवेदन में रख सकते हैं ताकि यह हर बार और लगातार प्राप्त होगा, जिससे आपको स्वचालित रूप से एक अद्यतन डेटा मिलेगा .. इस लिंक का उपयोग करें अधिक जानकारी के लिए…।
http://www.intridea.com/blog/2011/5/24/how-to-use-application-object-of-android
किसी अन्य लंबे समय तक चलने वाले धागे या अन्य वस्तुओं के लिए जो आपके आवेदन के लिए बाध्यकारी हैं, जहां आप किसी गतिविधि का उपयोग नहीं कर रहे हैं (एप्लिकेशन एक गतिविधि नहीं है), जो आपके द्वारा आवेदन की गुंजाइश में स्टोर किए जा सकने वाले अन्य उत्तरों को जोड़ने के लिए कह सकते हैं। जैसे कि एक बंधी हुई सेवा का अनुरोध करने में सक्षम नहीं किया जा रहा है .. तो आवेदन उदाहरण के लिए बाध्य करना पसंद किया जाता है। इस दृष्टिकोण के साथ एकमात्र स्पष्ट चेतावनी यह है कि वस्तुएं जितने समय तक जीवित रहती हैं, उतने समय तक जीवित रहती है, इसलिए स्मृति पर अधिक अंतर्निहित नियंत्रण की आवश्यकता होती है, अन्यथा आप स्मृति से संबंधित समस्याओं जैसे कि लीक।
कुछ और जो आपको उपयोगी लग सकता है वह यह है कि संचालन के क्रम में, किसी भी गतिविधि से पहले आवेदन शुरू होता है। इस समय सीमा में, यदि आप चाहें तो आप अपनी पहली गतिविधि से पहले कोई भी आवश्यक हाउसकीपिंग तैयार कर सकते हैं।
2018-10-19 11:31:55.246 8643-8643/: application created
2018-10-19 11:31:55.630 8643-8643/: activity created