2010-12-17 12 views
11

मैं अभी भी एंड्रॉइड के लिए ताजा हूं और आईडी सोचता है कि ऐप लॉन्च होने पर मेरी सेवा लॉन्च करने के लिए नीचे कॉन्फ़िगरेशन काम करता है।ऐप लॉन्च होने पर एंड्रॉइड सेवा कैसे लॉन्च करें?

<service android:name=".PlaylistUpdaterService"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </service> 

लेकिन ऐसा नहीं है। मुझसे क्या छूट गया?

उत्तर

8

अगर मैं गलत हूं, तो मुझे सही करें, लेकिन android.intent.category.LAUNCHER केवल गतिविधि के लिए मान्य है। तो, सेवा शुरू करने के लिए वैध तरीके की तरह दिखता नहीं है। एक ही आप प्राप्त कर सकते हैं यदि आप निम्न कार्य करें:

  • पारदर्शी गतिविधि है कि केवल उपयोग किया जाएगा कि गतिविधि के लिए सेवा
  • शुरू करने के लिए बनाते हैं, आप जीयूआई लेआउट निर्दिष्ट करने की आवश्यकता नहीं है। इसलिए, आपको गतिविधि के ऑनक्रेट() में CONTontView() सेट करने की आवश्यकता नहीं है। AndroidManifest.xml में इस गतिविधि के लिए थीम टैग के तहत शैली/Theme.NoDisplay

    : केवल एक चीज आप की जरूरत

@Android डाल करने के लिए है। अपनी गतिविधि की onCreate() से

  • शुरू सेवा।
  • finish()onStart() में इसे बंद करने के लिए अपनी गतिविधि के कॉल करें।

तो, आपकी गतिविधि उपयोगकर्ता के लिए अदृश्य हो जाएगी, आखिरी बार और कोई भी यह नहीं देख पाएगा कि इसका उपयोग सेवा शुरू करने के लिए किया गया था।

+0

यह विधि यूआई को लॉक करता है क्योंकि गतिविधि चल रही है लेकिन चूंकि यह पारदर्शी पर सेट है, कोई भी कुछ नहीं कर सकता है। क्या इस यूआई लॉकिंग से बचने का कोई तरीका है –

+0

@ नोबल 6 - इसे और अधिक स्पष्ट करने के लिए मेरा उत्तर अपडेट किया गया। मूल्यवान टिप्पणी के लिए धन्यवाद। – Zelimir

+3

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

19

गलत! Application कक्षा (आईई अपना खुद का बनाओ) का विस्तार करें, फिर onCreate() विधि में यह करें।

//Service is below 
Intent serviceIntent = new Intent(getApplicationContext(), PlaylistUpdaterService.class); 
startService(serviceIntent); 

और मैनिफेस्ट फ़ाइल में अपनी घोषणा से उस इरादे फ़िल्टर बकवास को ले लें। निम्नलिखित की जरूरत है अपने घर गतिविधियों में होने के रूप में

<service android:name=".PlaylistUpdaterService"> 

छोड़ दें लक्ष्य फ़िल्टर केवल

<intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
    <category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 

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

दरअसल यदि आप अपनी होम स्क्रीन पर वापस जाने के लिए हर बार सेवा चलाने की इच्छा रखते हैं, तो आपको अपनी होम क्लास onResume() में सेवा शुरू करनी चाहिए। इसे onCreate() में डालने से केवल सेवा शुरू हो जाएगी यदि उपयोगकर्ता पहली बार लॉन्च हो रहा है, या चलने की प्रक्रिया के बाद। या आप इसे अपने होम क्लास onCreate() में डाल सकते हैं लेकिन यह हर बार चलाने की भी गारंटी नहीं है।

+0

आप गलत कहते हैं, लेकिन आप इरादे फ़िल्टर श्रेणी भी सेट करते हैं। गतिविधि के लिए लांचर जैसा मैं करता हूं। इसके अलावा, आपका दृष्टिकोण भी सही है। – Zelimir

+0

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

+3

@RobbieVercammen - यदि कोई सेवा चल रही है, तो दूसरी बार कॉल करना कुछ भी नहीं करेगा। यह पहले गलत व्यवहार है। –

संबंधित मुद्दे