2012-02-11 11 views
10

मुझे निम्नलिखित व्यवहार चाहिए: उपयोगकर्ता एक अधिसूचना पर क्लिक करता है और एंड्रॉइड मेरी सेवा बंद कर देता है।क्या उपयोगकर्ता को अधिसूचना पर क्लिक करने के जवाब में सेवा रोकने का एक सीधा तरीका है?

समस्या यह है कि किसी सेवा को रोकने के लिए कॉल रोकने के लिए कॉल की आवश्यकता होती है और मैं आसानी से लंबित इंटेन्टेंट नहीं बना सकता जो ऐसा करता है।

तो मुझे ऐसा करने का एकमात्र तरीका यह है कि मेरी सेवा को एक विशेष इरादा अतिरिक्त प्राप्त किया जाए जो सेवा को रोकने और बंद होने का कारण बनता है।

क्या अधिसूचना से सीधे सेवा रद्द करने का कोई आसान तरीका है?

उत्तर

6

आप एक साधारण BroadcastReceiver बना सकते हैं जो stopService() कॉल करता है, और इसे ट्रिगर करने के लिए getBroadcast()PendingIntent का उपयोग करें। BroadcastReceiver को मेनिफेस्ट में या registerReceiver() के माध्यम से Service द्वारा पंजीकृत किया जा सकता है (बाद के मामले में, यह stopService() के बजाय stopSelf() करेगा)।

शायद आपके पास जो कुछ भी है उससे कहीं अधिक सरल नहीं है, और PendingIntent से stopService() कॉल को सीधे ट्रिगर करने का कोई तरीका नहीं है।

+0

मैं एक लंबे समय के लिए इस का उपयोग किया है, लेकिन यह अब और काम नहीं करता। एंड्रॉइड एल (5.0) से शुरू होने पर, आपको डेडऑब्जेक्ट एक्सेप्शन मिलेगा यदि उपयोगकर्ता ने आपके ऐप को हमारे रिकेंट सूची में स्वाइप किया है और एंड्रॉइड को मुख्य कार्य को मारने और सेवा को पुनरारंभ करने का कारण बनता है (ऐसा होता है यदि आपके पास कुछ यूआई के साथ स्थानीय सेवा हो स्वाइप आउट) – gnobal

+2

@gnobal: 'DeadObjectException' केवल बाध्यकारी AFAIK के माध्यम से होता है। इस समाधान में बाध्यकारी शामिल नहीं है। – CommonsWare

+0

न तो मेरा करता है। हालांकि, मैं startService का उपयोग करता हूं। लेकिन चूंकि मैं इसे दिखाने के लिए एक छोटा सा उदाहरण प्रदान करने के लिए बहुत आलसी हूं, मुझे विश्वास होगा कि यह सिर्फ मेरा ऐप है जो अच्छी तरह से काम नहीं कर रहा है। किसी भी मामले में, मैंने आपके द्वारा पेश किए गए एक अलग समाधान पर स्विच किया: http://stackoverflow.com/a/11145822/7748 :) – gnobal

13

धन्यवाद कॉमन्सवेयर।

यहां रुचि रखने वालों के लिए आपके समाधान का एक त्वरित उदाहरण दिया गया है।

कोड सेवा कक्षा में है।

// Create Notification 
private void initNotification() {  
    //Register a receiver to stop Service 
    registerReceiver(stopServiceReceiver, new IntentFilter("myFilter")); 
    PendingIntent contentIntent = PendingIntent.getBroadcast(this, 0, new Intent("myFilter"), PendingIntent.FLAG_UPDATE_CURRENT); 
    notification.setLatestEventInfo(context, contentTitle, contentText,contentIntent); 
    mNotificationManager.notify(NOTIFICATION_ID,notification); 
... 
} 



//We need to declare the receiver with onReceive function as below 
protected BroadcastReceiver stopServiceReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
    stopSelf(); 
    } 
}; 
+4

क्या रिसीवर को कभी "अनियंत्रित" होने की आवश्यकता है? – MobileMon

+0

@MobileMon, हाँ, इसे 'stopSelf()' –

+0

से पहले करना चाहिए, मैं लगभग आपके कोड पर आधारित हूं ... लेकिन यह काम नहीं कर रहा है, http://stackoverflow.com/questions/39956088/not-receiving-notification- क्लिक में सेवा – Alex

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

  • कोई संबंधित समस्या नहीं^_^