आशय और लंबित अंतर


97

मैं कुछ लेखों के माध्यम से पढ़ता हूं और दोनों एक ही काम करते हैं और मैं सोच रहा था कि इस तरह सेवा शुरू करने में क्या अंतर है:

Intent intent = new Intent(this, HelloService.class);
startService(intent);

या उस तरह:

Calendar cal = Calendar.getInstance();
Intent intent = new Intent(this, MyService.class);
PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent); 

जैसा कि मैंने पढ़ा, ये दोनों एक ही काम करते हैं, यदि सेवा में आप एक पैरामीटर START_STICKY लौटाते हैं;


कोई अंतर नहीं है। क्या आपको लगता है कि वहाँ होगा? पहले मामले में आप इसे 'अभी' शुरू कर रहे हैं और दूसरे में आप इसे बाद के समय / डेटा के लिए निर्धारित कर रहे हैं।
स्क्वॉन्क

जवाबों:


150

इरादा

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

आशय स्वयं, एक आशय वस्तु, एक निष्क्रिय डेटा संरचना है। यह निष्पादित किए जाने वाले किसी ऑपरेशन का एक सार विवरण रखता है।

उदाहरण के लिए: मान लें कि आपके पास एक गतिविधि है जिसे ईमेल क्लाइंट लॉन्च करने और ईमेल भेजने की आवश्यकता है। ऐसा करने के लिए, आपकी गतिविधि ACTION_SENDउचित चयनकर्ता के साथ कार्रवाई के साथ एक इरादे को Android इरादे में भेज देगी :

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:")); // only email apps should handle this

निर्दिष्ट चयनकर्ता उपयोगकर्ता को आपके ईमेल डेटा भेजने का तरीका चुनने के लिए उचित इंटरफ़ेस देता है।

शोषण के इरादे

// Explicit Intent by specifying its class name
   Intent i = new Intent(this, TargetActivity.class);
   i.putExtra("Key1", "ABC");
   i.putExtra("Key2", "123");

// Starts TargetActivity
   startActivity(i);

महत्वपूर्ण इरादे

// Implicit Intent by specifying a URI
   Intent i = new Intent(Intent.ACTION_VIEW, 
   Uri.parse("http://www.example.com"));

// Starts Implicit Activity
   startActivity(i); 

लंबित इरादा

एक PendingIntent एक टोकन है जिसे आप एक विदेशी एप्लिकेशन (जैसे NotificationManager, AlarmManager, Home Screen AppWidgetManager, या अन्य 3rd पार्टी एप्लिकेशन) को देते हैं, जो विदेशी एप्लिकेशन को आपके पूर्वनिर्धारित कोड को निष्पादित करने के लिए आपके एप्लिकेशन की अनुमतियों का उपयोग करने की अनुमति देता है।

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

लंबित इरादे के लिए उदाहरण: http://android-pending-intent.blogspot.in/

स्रोत: एंड्रॉइड इंटेंट और एंड्रॉइड पेंडिंग इंटेंट्स

उम्मीद है की यह मदद करेगा।


26

PendingIntentका रैपर है Intent। जो विदेशी ऐप प्राप्त करता है PendingIntent, वह उस सामग्री को नहीं जानता है Intentजिसके द्वारा लिपटा गया है PendingIntent। विदेशी एप्लिकेशन का मिशन कुछ शर्तों के पूरा होने पर मालिक को इरादा वापस भेजना है (उदाहरण के लिए: शेड्यूल के साथ अलार्म, या क्लिक के साथ अधिसूचना ...)। शर्तों को मालिक द्वारा दिया जाता है लेकिन विदेशी ऐप द्वारा संसाधित किया जाता है (उदाहरण के लिए: अलार्म, अधिसूचना)।

यदि विदेशी ऐप ने आपके ऐप पर इरादा भेजा है, तो इसका मतलब है कि विदेशी ऐप इरादे की सामग्री के बारे में जानता है। और विदेशी ऐप इरादे भेजने का निर्णय लेते हैं तो आपके ऐप को कुछ शर्तों को पूरा करने के इरादे को संसाधित करना होगा => आपके ऐप को सिस्टम का प्रदर्शन संसाधन मिलता है।


5

एक और सरल अंतर:

  • ऐप को मारते ही सामान्य इरादे मर जाएंगे।

  • लंबित इरादे कभी नहीं मरते। जब तक यह अलार्म सेवा, स्थान सेवा, या किसी अन्य सेवाओं द्वारा आवश्यक है, तब तक वे जीवित रहेंगे।


1

AlarmManager के माध्यम से नियमित रूप से सेवाएं शुरू करना

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

इसलिए, सेवा के सही समय-निर्धारण के लिए AlarmManagerवर्ग का उपयोग करें ।

अपडेट करें:

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

AndroidServices में अधिक जानकारी ।


2
यह वास्तव में ओपी के सवाल का जवाब नहीं देता है जो सीधे सेवा शुरू करने और अलार्म के साथ सेवा शुरू करने के बीच "क्या अंतर है" है। इसके अलावा, ओपी ने संभवतः आपके द्वारा लिंक किए गए लेख को लेख में देखा है कि ओपी ने जो पोस्ट किया है वह लगभग समान है।
स्कवॉन्क

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

@ Eu.Dr। मैं आपको अलार्म मैनेजर का उपयोग करने की सलाह देता हूं जो हर समय एक्स पर ट्रिगर किया जाएगा ... कार्य निष्पादित करें .. क्यों? क्योंकि यदि आप सेवाओं का उपयोग करते हैं तो यह किसी बिंदु पर बंद हो सकता है और आप कुछ अपडेट को एक निश्चित समय (अज्ञात) पर समाप्त कर सकते हैं। संदर्भ संदेह के लिए, getApplicationContext()जब आप इसे कड़ाई से चाहते हैं , तो इसका उपयोग या उपयोग न करें , बस पढ़ें - जब-टू-कॉल-गतिविधि-संदर्भ-या-अनुप्रयोग-संदर्भ ( stackoverflow.com/questions/7298731/… )।
मेरा भगवान

1

कार्यात्मक रूप से, कोई अंतर नहीं है।

PendingIntent का अर्थ यह है कि, आप इसे अन्य एप्लिकेशन को संभाल सकते हैं जो बाद में इसका उपयोग कर सकते हैं जैसे कि अन्य एप्लिकेशन स्वयं था। यहाँ प्रलेखन से प्रासंगिक व्याख्या है :

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

एक PendingIntent केवल सिस्टम द्वारा बनाए गए एक टोकन का संदर्भ है जो इसे पुनर्प्राप्त करने के लिए उपयोग किए गए मूल डेटा का वर्णन करता है।

तो PendingIntent केवल उस डेटा का संदर्भ है जो मूल इरादे का प्रतिनिधित्व करता है (जो PendingIntent बनाने के लिए उपयोग किया जाता है)।


4
यह कहना कि कार्यात्मक रूप से कोई अंतर गलत नहीं है। यदि दोनों के कार्य समान हैं तो दो में 1 स्थान क्यों है? उस PendingIntent में सबसे महत्वपूर्ण अंतर दूरस्थ घटक (जैसे NotificationManager) द्वारा निष्पादित किया जाता है उसी घटक के रूप में जो इसे सौंपता है (वह जो अधिसूचना बनाता है)।
अनिकेत ठाकुर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.