2012-05-18 16 views
7

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

मान लीजिए कि हम trival सेवा रूपरेखा है इस तरह के

public class HliService extends Service { 

    @Override 
    public void onCreate() { 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     // If we get killed, after returning from here, restart 
     return START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // We don't provide binding, so return null 
     return null; 
    } 

    @Override 
    public void onDestroy() { 
    } 
} 

के रूप में और प्रकट में, मैं

<service android:name=".HliService" android:process=":HLI_Comms"/> 

ताकि सेवा का स्वयं का धागा में चलता चला रहे हैं।

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

// Method that communicates using a TCP socket, and needs to send 
// information back to the activity and receive messages from activity 
// not shown here. 
private void dummytask() { 

    boolean keepGoing = true; 
    while (keepGoing) { 
     // do useful stuff in here 
     // sets keepGoing false at some point 
    } 
    stopSelf(); 
} 

इस विधि/कार्य आरंभ करने के लिए सबसे अच्छा तरीका क्या है की तरह कुछ?

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

मुझे विश्वास नहीं है कि मैं इस विधि को onCreate() या onStartCommand() से कॉल कर सकता हूं तब से सिस्टम से आने पर पूरा नहीं होगा? क्या मुझे इसे टाइमर या अलार्म से शुरू करना चाहिए?

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

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

+0

'जबकि (keepGoing)' - अगर यह किसी अन्य थ्रेड में है जो 'रखने के लिए' रखता है, तो 'रखने के लिए' रखना चाहिए 'रखना' होना चाहिए - जावा मेमोरी मॉडल –

+0

पर पढ़ें कृपया यह उत्तर देखें यह आपकी मदद कर सकता है । [कड़ी यहाँ विवरण दर्ज] [1] [1]: http://stackoverflow.com/a/13783477/2165080 –

उत्तर

2

ताकि सेवा अपने स्वयं के धागे में चल सके।

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

बैटरी समस्याओं को अनदेखा करने के जोखिम पर, मूल रूप से मैं इसे हमेशा के लिए चलाने के लिए चाहता हूं।

सेवा के लिए हमेशा के लिए चलाने के लिए यह बहुत असंभव है। उपयोगकर्ता या ओएस अंततः आपकी सेवा से छुटकारा पायेगा।

इस विधि/कार्य को शुरू करने का सबसे अच्छा तरीका क्या है?

पृष्ठभूमि थ्रेड से dummytask() पर कॉल करें।

क्या मुझे इसके बजाय एआईडीएल का उपयोग करने की आवश्यकता है?

सं आपकी सेवा एक Intent प्रसारित कर सकते हैं, या एक PendingIntent गतिविधि द्वारा आपूर्ति आह्वान, या एक Messenger गतिविधि, आदि सबसे अच्छा द्वारा आपूर्ति के माध्यम से एक Message भेज Android समर्थन से LocalBroadcastManager उपयोग करने के लिए किया जाएगा पैकेज, लेकिन यह प्रक्रिया सीमाओं में काम नहीं करेगा, आपको अधिक महंगी संचार विकल्पों में मजबूर करेगा।

+0

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

+0

@CommonsWare उपरोक्त स्पष्टीकरण के लिए धन्यवाद ... वास्तव में अच्छा एक – Biplab

0

मुझे लगता है कि आप IntentService का उपयोग कर सकते हैं जिसे आप PendingIntent के साथ एक (नियमित) अलार्म (AlarmManager.setRepeating) स्थापित करके चला सकते हैं। आप IntentService से एक इरादा प्रसारित करके यूआई को सूचित कर सकते हैं और BroadcastReceiver के माध्यम से इसे अपने यूआई में प्राप्त कर सकते हैं।

+0

धन्यवाद @omoling- क्या यह एक छोटे से काम को चलाने और फिर समाप्त करने के लिए उपयुक्त नहीं है, बल्कि एक लंबी चल रही प्रक्रिया शुरू करने के लिए? – SteveJP

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