2010-02-01 18 views
23

मेरे पास वर्तमान में एक सेवा है जो इसे शुरू करने पर ठीक चलती है लेकिन जब मैं इसे रोक सेवा सेवा विधि का उपयोग करके रोकने की कोशिश करता हूं तो इसकी ऑनस्ट्राय विधि को कॉल नहीं किया जाता है।स्टॉप सेवा बंद होने पर सेवा बंद नहीं होगी

यहाँ कोड मैं सेवा

stop_Scan_Button = (बटन) findViewById (R.id.stopScanButton) को रोकने की कोशिश करने के लिए उपयोग है,

stop_Scan_Button.setOnClickListener(new View.OnClickListener(){ 
    public void onClick(View v){ 
     Log.d("DEBUGSERVICE", "Stop Button pressed"); 
     Intent service = new Intent(CiceroEngine. CICERO_SERVICE); 
     releaseBind(); 
     Log.d("Stop_Scan_Button", "Service: " + service.toString()); 
     stopService(service); 
     Log.d("Stop_Scan_Button", "Service should stop! "); 

     } 
}); 

क्या मैं सोच रहा हूं कि जब स्टॉप सेवा का उपयोग किया जाता है तो यह सेवा की ऑनस्ट्राय विधि को कॉल करता है? जब मैं अपना स्टॉप स्कैन बटन दबाता हूं तो onDestroy() मेरी सेवा में विधि नहीं कहा जाता है।

क्या कोई और चीज है जो मुझे याद आ रही है कि मुझे सेवा को रोकने के लिए रखा जाना चाहिए?

संपादित करें: onServiceConnected() जोड़ने के लिए कहा जाता है जब onServiceDisconnected() के बजाय stopService चलाया जाता है, यह क्यों हो रहा है?

संपादित करें: को जोड़ने के लिए और अधिक जानकारी

बाइंडिंग का संबंध रहा onCreate में bindService() विधि कहते हैं और मैं तो releaseBind() विधि सेवा निकल की है।

public void releaseBind(){ 
    unbindService(this); 
    } 

तो मुझे लगता है कि unbinding मेरी समस्या नहीं है:

यहाँ कि विधि के लिए कोड है?

उत्तर

42

मुझे लगता है कि करने के लिए है कि अपने releaseBind() के लिए एक विधि कॉल होने जा रहा हूँ मतलब है कि आप पहले से इस सेवा पर bindService() बुलाया और कहा कि releaseBind()unbindService() बुला रहा है। अगर मेरा अनुमान गलत है, तो कृपया इस उत्तर को अनदेखा करें।


एक सेवा बंद हो जाएगा सब bindService() कॉल के बाद उनकी संगत unbindService() कॉल पड़ा है। यदि कोई बाध्य ग्राहक नहीं हैं, तो सेवा को stopService() की आवश्यकता होगी यदि केवल और अगर किसी को सेवा पर startService() कहा जाता है।

तो, यहाँ कुछ संभावनाएं देखते हैं:

  1. तुम अब भी बाध्य है ग्राहकों (जैसे, अन्य गतिविधियां), जिस स्थिति में आप सेवा जब तक वे निकल
  2. दोनों unbindService() और stopService() के बाद से नहीं रोक सकता अतुल्यकालिक कर रहे हैं, कुछ समय, जिस स्थिति में आप बेहतर किस्मत मिल सकता है अगर आप से stopService() फोन के साथ बिगड़ संभवतः जा रहे हैं अपने ServiceConnection के onServiceDisconnected() विधि

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

+1

मैं अपने मूल प्रश्न संपादित किया है मेरी बंधन के बारे में जानकारी शामिल करने के लिए, मैं इसे बाध्यकारी और फिर unbinding –

+2

Ummm, कि कोड पूरी तरह से में गड़बड़ और है की क्या ज़रूरत है लगभग निश्चित रूप से आपकी समस्या में योगदान। 'bindService()' और 'unbindService()' अतुल्यकालिक हैं और आप जिस तरीके से उपयोग कर रहे हैं, उसमें असफल होने की गारंटी दी जाती है। दुर्भाग्य से, मुझे नहीं पता कि आप यहां क्या करने की कोशिश कर रहे हैं, इसलिए मेरे पास आपको सलाह देने का कोई अच्छा तरीका नहीं है। – CommonsWare

+0

यह सिर्फ दो बटन यूआई है, एक सेवा शुरू करने के लिए और इसे रोकने के लिए एक। मैंने अपनी रिलीज से बाहर बयान लिया है बाइंड() विधि केवल unBindService (यह) छोड़कर; यह सेवा को अपंजीकृत करने के लिए प्रतीत होता है जब मैं दूसरी बार उस पर क्लिक करता हूं तो मुझे "सेवा पंजीकृत नहीं है" त्रुटि मिलती है। हालांकि, स्टॉप सेवा अभी भी मेरी सेवा में ऑनस्ट्रोय() विधि को कॉल करने के लिए प्रतीत नहीं होती है, पृष्ठभूमि सेवाएं अभी भी –

10

क्या आपके सभी बाइंडिंग बंद हैं?

A service can be used in two ways. दो मोड पूरी तरह अलग नहीं हैं। आप एक सेवा से जुड़ सकते हैं जो startService() के साथ शुरू किया गया था। उदाहरण के लिए, एक पृष्ठभूमि संगीत सेवा startService() को एक इरादा ऑब्जेक्ट के साथ कॉल करके शुरू किया जा सकता है जो संगीत को खेलने के लिए पहचानता है। केवल बाद में, संभवतः उपयोगकर्ता खिलाड़ी पर कुछ नियंत्रण व्यायाम या जानकारी के बारे में वर्तमान गीत पाने के लिए, एक गतिविधि bindService फोन करके सेवा से कनेक्शन स्थापित होता चाहता है जब()। मामलों में इस तरह, stopService() वास्तव में सेवा बंद नहीं होगा पिछले बंधन जब तक

बंद कर दिया है।

+0

ये मैं केवल इसे एक बार बांधता हूं और फिर रिलीज बाइंड() को अनबिंड करने के लिए कॉल करता हूं –

4

है दोस्तों को देर से उत्तर के लिए खेद है, लेकिन जहां तक ​​मुझे पता है कि मैंने इस कोड में सेवा को सफल बना दिया है: आप यहां link देख सकते हैं।

public void onClick(View src) { 
switch (src.getId()) { 
case R.id.buttonStart: 
    Log.d(TAG, "onClick: starting srvice"); 
    startService(new Intent(this, MyService.class)); 
    break; 
case R.id.buttonStop: 
    Log.d(TAG, "onClick: stopping srvice"); 
    stopService(new Intent(this, MyService.class)); 
    break; 
} 
} 

और सेवाओं कक्षा में:

public class MyService extends Service { 
     private static final String TAG = "MyService"; 


@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onCreate() { 
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onCreate"); 


} 

@Override 
public void onDestroy() { 
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onDestroy"); 

} 

@Override 
public void onStart(Intent intent, int startid) { 
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onStart"); 

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