Android एप्लिकेशन क्लास का विस्तार क्यों करें?


168

एक विस्तारित Applicationवर्ग वैश्विक चर घोषित कर सकता है। क्या अन्य कारण हैं?


यह सिर्फ मेरे सिर के ऊपर से एक विचार है, लेकिन आपको ऑनक्रिएट को ओवरराइड करने और मेनऐक्टिविटी के बजाय एक बार स्टार्ट अप स्क्रीन दिखाने में सक्षम होना चाहिए, यानी उपयोगकर्ता द्वारा ऐप को पहली बार खोलने पर इंट्रो स्क्रीन।
btse

जवाबों:


29

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

मैं स्पष्ट इरादों के साथ गतिविधि से गतिविधि तक डेटा पास करना पसंद करता हूं, या साझाकरण का उपयोग करता हूं। इंटरफेस का उपयोग करके किसी फ्रैगमेंट से इसकी पैरेंट एक्टिविटी तक डेटा पास करने के भी तरीके हैं।


39
आवेदन वर्ग का विस्तार करने के कई उपयोग हैं। एक बहुत उपयोगी आप आवेदन में सभी अप्रकाशित अपवादों को पकड़ने के लिए है। अतः यह कुछ है जो बहुत आसान हो सकता है
png

3
आप उसे कैसे करते हैं ?
सर्ज

8
के लिए +1 "prefer to pass data from Activity to Activity with explicit Intents, or use SharedPreferences"। हमें हमेशा वैश्विक स्थिति को समाप्त करना चाहिए जितना हम कर सकते हैं और स्थिर स्टेट्स /
सिंगलेट्स

9
क्यों? कुछ बिंदुओं पर उन्हें चलाने के लिए एंड्रॉइड के लिए तैयार करने के लिए या किसी भी ऐप द्वारा पुन: प्रयोज्य होने वाले हर घटक को जो भी हो, जबकि वह जानबूझकर सीमित है? डेटा ऑब्जेक्ट्स को केवल अनुक्रमित करने के बजाय पास करने से सीपीयू और मेमोरी बचती है। अंदर-प्रक्रिया-ऑन-ही-डिवाइस हैंडओवर के लिए सामान पार्सल करना किसी भी तरह से आदर्श नहीं है। मैं वास्तव में इस तरह के intentservice उपयोग की बात नहीं देख रहा हूँ (बस नए के साथ दूसरे सूत्र)। वास्तव में बहुत सारे सामान जो कोडर्स को भ्रमित करते हैं, उस बहुत से सभी Google जोड़े "हेल्पर्स" से आते हैं जैसे कि अलग-अलग कंप्यूटरों पर गतिविधियां चलती हैं।
लस्सी किन्नुनेन

127

परिचय:

यहां छवि विवरण दर्ज करें

  1. यदि हम apkअपने मोबाइल में एक फ़ाइल पर विचार करते हैं , तो यह कई उपयोगी ब्लॉकों से मिलकर बनता है, जैसे कि, Activitys, Services और अन्य।
  2. ये घटक नियमित रूप से एक दूसरे के साथ संवाद नहीं करते हैं और यह नहीं भूलते हैं कि उनका अपना जीवन चक्र है। जो यह दर्शाता है कि वे एक समय में सक्रिय हो सकते हैं और दूसरे क्षण को निष्क्रिय कर सकते हैं।

आवश्यकताएँ:

  1. कभी-कभी हमें एक ऐसे परिदृश्य की आवश्यकता हो सकती है जहाँ हमें एक चर का उपयोग करने की आवश्यकता होती है और उपयोगकर्ता Applicationकी परवाह किए बिना पूरे राज्य में Activityइसका उपयोग किया जाता है:
  2. एक उदाहरण यह है कि एक उपयोगकर्ता को एक चर को एक्सेस करने की आवश्यकता हो सकती है जो अपने कर्मियों की जानकारी (जैसे नाम) रखता है, जिसे उस पार पहुँचा जा सकता है Application,
  3. हम SQLite का उपयोग कर सकते हैं लेकिन Cursorइसे बनाने और इसे फिर से बंद करने और प्रदर्शन पर अच्छा नहीं है,
  4. हम Intentडेटा को पास करने के लिए s का उपयोग कर सकते हैं लेकिन यह अनाड़ी है और स्मृति-उपलब्धता के आधार पर गतिविधि निश्चित रूप से मौजूद नहीं हो सकती है।

अनुप्रयोग वर्ग के उपयोग:

  1. चर में प्रवेश Application,
  2. Applicationएनालिटिक्स आदि जैसी कुछ चीजों को शुरू करने के लिए आप उपयोग कर सकते हैं क्योंकि एप्लिकेशन क्लास शुरू होने से पहले शुरू हो जाती है Activityया Servicesचलाया जा रहा है,
  3. ऑनकॉन्फ़िगरेशनचेंज () नाम की एक ओवरराइड विधि है जो तब शुरू होती है जब एप्लिकेशन कॉन्फ़िगरेशन बदल जाता है (क्षैतिज से ऊर्ध्वाधर और इसके विपरीत),
  4. वहाँ भी एक घटना है onLowMemory () कहा जाता है कि जब ट्रिगर Android डिवाइस स्मृति पर कम है।

अपने आवश्यकता वाले हिस्से में, साझाकरण का उपयोग क्यों नहीं करते?

व्यक्तिगत इन्फोस को बचाने के लिए 1 उदाहरण में, SharedPreferences का उपयोग किया जा सकता है। लेकिन आपने पिछले भाग में जो उदाहरण दिए, उन्होंने मेरे संदेह को दूर किया। धन्यवाद!
सौरभ सिंह

63

एप्लिकेशन क्लास वह ऑब्जेक्ट है जिसमें आपके एप्लिकेशन का पूरा जीवनचक्र होता है। यह एक एप्लिकेशन के रूप में आपकी उच्चतम परत है। उदाहरण संभव उपयोग:

  • आप अनुप्रयोग वर्ग में onCreate को ओवरराइड करके शुरू करने पर आपको जो कुछ भी ज़रूरत है उसे जोड़ सकते हैं।

  • वैश्विक चर कि गतिविधि से गतिविधि के लिए कूद। एसिंक्टस्क की तरह।

    आदि


4
एप्लिकेशन-ग्लोबल वैरिएबल के लिए डंपिंग ग्राउंड के रूप में एप्लिकेशन का उपयोग करना एक बड़ी कोड गंध है। इसे पूरा करने के लिए आपको अपने स्वयं के कस्टम, अधिक विशिष्ट वर्गों को सिंगलटन या स्थिर चर के साथ उपयोग करना चाहिए।
ऑस्टिन

5
@Austin क्यों यह एक गंध है?
Relm

1
हाँ, गंध क्यों? जैसा कि पहले कहा गया है, अनुप्रयोग वर्ग पदानुक्रम के शीर्ष पर है, और मैं अपने दोपहर के भोजन के पैसे को दांव पर लगा सकता हूं, कि एक कस्टम सिंगलटन वर्ग इसके नीचे है। इसलिए, अगर धक्का धक्का देने के लिए आता है, और आपका फोन मेमोरी पर कम है, तो मैं कहूंगा कि कस्टम सिंगलटन एप्लिकेशन क्लास (जो अनिवार्य रूप से आपका पूरा ऐप है) के बजाय मारने के लिए पहला है।
स्टारवेट

31

कभी-कभी आप डेटा को संग्रहित करना चाहते हैं, जैसे वैश्विक चर जिन्हें कई गतिविधियों से एक्सेस करने की आवश्यकता होती है - कभी-कभी एप्लिकेशन के भीतर हर जगह। इस मामले में, एप्लिकेशन ऑब्जेक्ट आपकी सहायता करेगा।

उदाहरण के लिए, यदि आप प्रत्येक 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;
    }
}

अधिक जानकारी के लिए, कृपया आवेदन वर्ग पर क्लिक करें


2
कृपया मुझे यह समझाएं, क्यों हमें स्पष्ट रूप से एक अनुप्रयोग वर्ग के सिंगलटन ऑब्जेक्ट बनाने की आवश्यकता है, जहां तक ​​मुझे पता है कि यह स्वयं एक सिंगलटन है। क्या हम कई एप्लिकेशन ऑब्जेक्ट बना सकते हैं, अगर हम कर सकते हैं तो कैसे? और परिणाम क्या है? कृपया समझाएं।
सैयद रज़ा मेहदी

नहीं, शायद केवल एक आवेदन वर्ग। डेवलपर
.android.com/guide

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

1
धन्यवाद मुझे इस लिंक पर मेरा जवाब मिला। डेवलपर
सैयद रज़ा मेहदी

उस में * सिंगलटन * ऑब्जेक्ट कहां है
डॉ। एनडीआरओ

8

एप्लिकेशन क्लास एक सिंगलटन है जिसे आप किसी भी गतिविधि से एक्सेस कर सकते हैं या कहीं और भी आपके पास एक कॉनटेक्स्ट ऑब्जेक्ट हो सकता है।

आपको थोड़ा सा जीवनचक्र भी मिलता है।

आप महंगे इंस्टेंट करने के लिए एप्लिकेशन की ऑनक्रिएट विधि का उपयोग कर सकते हैं, लेकिन अक्सर एक विश्लेषिकी सहायक जैसी वस्तुओं का उपयोग किया जाता है। तब आप उन वस्तुओं का उपयोग और उपयोग हर जगह कर सकते हैं।


6
"तुम भी थोड़ा सा जीवनदान पाओ।" आप चाहते हैं कि इसका पुन: निर्माण किया जाए।
वत्संग ०२

2
मेरा मतलब है कि आपको कुछ जीवनचक्र वाले कॉल मिलते हैं, लेकिन किसी गतिविधि या टुकड़े के रूप में नहीं। उदाहरण के लिए, अनुप्रयोग वर्ग के लिए कोई onDestroy () नहीं है।
जॉन एफ हैनकॉक

क्या यह वर्ग स्वचालित है?
कॉन्सटेंटिन कोनपोको

हाँ। जब तक आप इसे AndroidManifest.xml में सही ढंग से निर्दिष्ट करते हैं।
जॉन एफ हैनकॉक

नहीं, यह स्वचालित रूप से नहीं बनाया गया है। आपको इसे बनाना होगा और फिर इसे अपनी मैनिफ़ेस्ट फ़ाइल में घोषित करना होगा
ओजोनुवा जुड ओचलिफु

7

आवेदन वर्ग का सबसे अच्छा उपयोग। उदाहरण: मान लीजिए कि आपको अपने अलार्म मैनेजर को बूट पर पूरा करने की आवश्यकता है।

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

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

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

5

एक उत्तर नहीं बल्कि एक अवलोकन : ध्यान रखें कि विस्तारित एप्लिकेशन ऑब्जेक्ट में डेटा को किसी गतिविधि के उदाहरण से नहीं बांधा जाना चाहिए, क्योंकि यह संभव है कि आपके पास एक ही समय में चलने वाली एक ही गतिविधि के दो उदाहरण हों (एक में अग्रभूमि और एक दिखाई नहीं दे रहा है)

उदाहरण के लिए, आप सामान्य रूप से लॉन्चर के माध्यम से अपनी गतिविधि शुरू करते हैं, फिर इसे "कम से कम" करें। फिर आप एक और ऐप शुरू करते हैं (यानी टास्कर) जो आपकी सक्रियता का एक और उदाहरण शुरू करता है, उदाहरण के लिए शॉर्टकट बनाने के लिए, क्योंकि आपका ऐप android.intent.action.CREATE_SHORTCUT का समर्थन करता है। यदि शॉर्टकट तब बनाया गया है और गतिविधि के इस शॉर्टकट-बनाने वाले आह्वान ने डेटा को एप्लिकेशन ऑब्जेक्ट को संशोधित किया है, तो बैकग्राउंड में वापस लाए जाने के बाद पृष्ठभूमि में चल रही गतिविधि इस संशोधित एप्लिकेशन ऑब्जेक्ट का उपयोग करना शुरू कर देगी।


4

मैं देखता हूं कि इस सवाल का जवाब याद आ रहा है। मैं विस्तार करता हूं 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();
    }
}

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

टिप: एंड्रॉइड स्टूडियो सिंगलटन टेम्प्लेट को अपडेट करने से बहुत समय बचता है।


3

मुझे लगता है कि आप कई चीजों के लिए एप्लिकेशन क्लास का उपयोग कर सकते हैं, लेकिन वे सभी आपकी जरूरतों के लिए बंधे हुए हैं कुछ भी करने से पहले आपकी कोई भी गतिविधि या सेवा शुरू नहीं की जाती है। उदाहरण के लिए, मेरे आवेदन में मैं कस्टम फोंट का उपयोग करता हूं। फोन करने के बजाय

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()

मेरे लिए एप्लिकेशन क्लास के लिए एक और उपयोग यह जांचने के लिए है कि क्या डिवाइस इंटरनेट से जुड़ी गतिविधियों और सेवाओं से जुड़ा है, जिनके लिए कनेक्शन की आवश्यकता होती है, वास्तव में शुरू करते हैं और आवश्यक कार्रवाई करते हैं।


1
ख़ूब कहा है। बहुत अच्छा टूट गया।
ओलूवाटोबी एडेनेकन जूल

3

स्रोत: https://github.com/codepath/android_guides/wiki/Understanding-the-Android-Application-Class

कई ऐप में, एप्लिकेशन क्लास के साथ सीधे काम करने की कोई आवश्यकता नहीं है। हालाँकि, कस्टम अनुप्रयोग वर्ग के कुछ स्वीकार्य उपयोग हैं:

  • विशिष्ट कार्य जिन्हें आपकी पहली गतिविधि के निर्माण से पहले चलाने की आवश्यकता है
  • सभी घटकों (क्रैश रिपोर्टिंग, दृढ़ता) में वैश्विक आरंभीकरण को साझा करने की आवश्यकता है
  • स्थैतिक अपरिवर्तनीय डेटा जैसे साझा नेटवर्क क्लाइंट ऑब्जेक्ट तक आसान पहुंच के लिए स्टेटिक तरीके

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


1

यदि आप अनुप्रयोग द्वारा विस्तारित हैं, तो आप वस्तुओं को बनाए बिना किसी भी वर्ग में चर का उपयोग कर सकते हैं। उन्हें विश्व स्तर पर कहा जा सकता है और उनके राज्य को तब तक बनाए रखा जाता है जब तक कि आवेदन को मार न दिया जाए।


1

विस्तृत अनुप्रयोग का उपयोग आपके आवेदन को किसी भी प्रकार के संचालन के लिए सुनिश्चित करता है जो आप अपने आवेदन पत्र की अवधि के दौरान चाहते हैं। अब यह किसी भी प्रकार का हो सकता है और मान लें कि यदि आप सर्वर से कुछ डेटा प्राप्त करना चाहते हैं, तो आप अपने एसिंक्टस्क को आवेदन में रख सकते हैं ताकि यह हर बार और लगातार प्राप्त होगा, जिससे आपको स्वचालित रूप से एक अद्यतन डेटा मिलेगा .. इस लिंक का उपयोग करें अधिक जानकारी के लिए…।

http://www.intridea.com/blog/2011/5/24/how-to-use-application-object-of-android


यह एक धागा नहीं है, इसलिए "किसी भी तरह के ऑपरेशन के लिए जिसे आप अपने आवेदन के दौरान चाहते हैं।" यह सच नहीं है।
लस्सी किन्नुनेन

1

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

कुछ और जो आपको उपयोगी लग सकता है वह यह है कि संचालन के क्रम में, किसी भी गतिविधि से पहले आवेदन शुरू होता है। इस समय सीमा में, यदि आप चाहें तो आप अपनी पहली गतिविधि से पहले कोई भी आवश्यक हाउसकीपिंग तैयार कर सकते हैं।

2018-10-19 11:31:55.246 8643-8643/: application created
2018-10-19 11:31:55.630 8643-8643/: activity created
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.