2013-02-08 18 views
5

के बाद फिर से बनाई गई है, यह सेवा पहली बार है कि बूट, उसके बाद, गतिविधि हमेशा देखो अगर सेवा इसे फिर से शुरू से बचने के लिए शुरू कर दिया है मेरी गतिविधि द्वारा शुरू किया गया है।सेवा मैं एक दूरस्थ सेवा बनाया onTaskRemoved

सेवा onCreate समारोह में कुछ तरीकों को चलाते हैं। यह सेवा हमेशा चल रही है और बूट समय पर भी शुरू हुई है।

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

कोई विचार क्यों? और मैं इसे कैसे नियंत्रित कर सकता हूं?

<service 
     android:name=".Service" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/service_name" 
     android:process=":update_process" > 
</service> 

AndroidManifest.xml

if (!isRunning()) { 
    Intent service = new Intent(this, UpdateService.class); 
    startService(service); 
} else { 
    //Just to debug, comment it later 
    Toast.makeText(this, "Service was running", Toast.LENGTH_SHORT).show(); 
} 

जब सेवा प्रारंभ हो, तो यह

+0

मैं अपने प्रश्न के साथ स्पष्ट नहीं कर रहा हूँ। लेकिन सेवा के कई उदाहरणों के बारे में चिंता न करें। Calling [ 'startService()'] (http://developer.android.com/reference/android/content/Context.html#startService (android.content.Intent)) दूसरा काल से सेवा दो बार शुरू नहीं करता है, अगर यह पहले से चल रहा है। –

+0

@LaiVung एकाधिक उदाहरण समस्या नहीं है, समस्या यह है कि गतिविधि बंद होने के बाद विधि ऑनक्रेट को बुलाया जाता है, इसलिए ऑनक्रेट के अंदर की विधियों को फिर से बुलाया जाता है, और मैं नहीं चाहता हूं। – Marcel

+0

क्या आप अपनी गतिविधि के अंत में कुछ शुरू करते हैं (उदाहरण के लिए 'onDestroy() ')? –

उत्तर

8

समस्याओं नहीं चल रहा था कि आप सेवा डिफ़ॉल्ट प्रति चिपचिपा है, इसका मतलब है यह है कि जब मारे गए को पुन: प्रारंभ किया जाएगा, जब तक आप स्पष्ट रूप से पूछना के लिए इसे बंद कर दिया जाए।

अपनी सेवा में onStartCommand() विधि ओवरराइड करें, और इसे START_NOT_STICKY पर वापस लाएं। तब जब आप मारे गए तो सेवा को पुनरारंभ नहीं किया जाएगा।

@Override 
public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    return START_NOT_STICKY; 
} 
+0

बांध रहा था, तो मैं एक अनबिंड करता हूं, मैंने पहले ही हल किया है, और इस तरह, – Marcel

+1

@ मार्सेल: किसी भी तरीके से धन्यवाद, इस समस्या का उत्तर देने वाले अन्य लोग भी समाधान देख सकते हैं :) –

+0

है एक अच्छा समाधान चिपकाएं या टास्क रिमूड पर चिपकाएं। – Minkoo

6

हालांकि Bjarke के समाधान मान्य है, मैं एक वैकल्पिक समाधान है जो ऐसे मामलों में जहां यह सेवा में किसी भी वसूली प्रदर्शन करने के लिए आवश्यक हो सकता है को शामिल किया गया प्रस्ताव करने के लिए करना चाहते हैं।

एंड्रॉइड एक बार फिर से आपकी सेवा को पुनरारंभ करने के बाद onStartCommand() का आविष्कार कर रहा है ताकि आपको सूचित किया जा सके कि सेवा प्रक्रिया अप्रत्याशित रूप से दुर्घटनाग्रस्त हो गई है (क्योंकि इसका कार्य ढेर हटा दिया गया था), और अब इसे पुनरारंभ किया जा रहा है।

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

कुछ मामलों में यह, केवल इस तरह के पुनरारंभ होने के लिए NON_STICKY लौट कोई भी आवश्यक सफाई/वसूली करते हैं और सेवा को बंद इतना है कि आप शान से बाहर निकलने के लिए बुद्धिमान होगा।

जब सेवा सामान्य रूप से शुरू होती है, तो आपको अभी भी STICKY वापस लौटना चाहिए अन्यथा आपकी सेवा आपको कोई पुनर्प्राप्ति करने के लिए कभी भी पुनरारंभ नहीं किया जाएगा।

@Override 
public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    // intent is null only when the Service crashed previously 
    if (intent == null) { 
     cleanupAndStopServiceRightAway(); 
     return START_NOT_STICKY; 
    } 
    return START_STICKY; 
} 

private void cleanupAndStopServiceRightAway() { 
     // Add your code here to cleanup the service 

     // Add your code to perform any recovery required 
     // for recovering from your previous crash 

     // Request to stop the service right away at the end 
     stopSelf(); 
} 

एक अन्य विकल्प तो यह है कि एंड्रॉयड भी पहली जगह में सेवा को मारने के लिए नहीं है onTaskRemoved() के हिस्से के रूप आपकी सेवा के बंद का अनुरोध करने के लिए (stopSelf() का प्रयोग करके) होगा।

+0

क्या आप उसमें डेटाबेस में कुछ सहेज सकते हैं? –

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