2012-10-23 11 views
11

जब उपयोगकर्ता मेरी अधिसूचना को साफ़ करता है तो मैं अपनी सेवा के एक चर को रीसेट करना चाहता हूं: बस इतना ही!स्पष्ट अधिसूचना पर कुछ कार्रवाई करने के लिए हटाए गए इरादे का उपयोग कैसे करें?

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

void onClearPressed(){ 
    aVariable = 0; 
} 

कैसे इस परिणाम को प्राप्त करने के लिए?

उत्तर

39

अधिसूचनाएं आपके ऐप द्वारा प्रबंधित नहीं की जाती हैं और अधिसूचनाएं दिखाने और उन्हें साफ़ करने जैसी सभी चीजें वास्तव में किसी अन्य प्रक्रिया में होती जा रही हैं। सुरक्षा कारणों से आप एक और ऐप सीधे कोड के टुकड़े को निष्पादित नहीं कर सकते हैं।

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

प्रसारण रिसीवर के मामले में आप प्रसारण रिसीवर के लिए केवल एक अज्ञात आंतरिक कक्षा बना सकते हैं और अधिसूचना दिखाने से पहले इसे गतिशील रूप से पंजीकृत कर सकते हैं। यह कुछ ऐसा दिखाई देगा:

public class NotificationHelper { 
    private static final String NOTIFICATION_DELETED_ACTION = "NOTIFICATION_DELETED"; 

    private final BroadcastReceiver receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      aVariable = 0; // Do what you want here 
      unregisterReceiver(this); 
     } 
    }; 

    public void showNotification(Context ctx, String text) { 
     Intent intent = new Intent(NOTIFICATION_DELETED_ACTION); 
     PendingIntent pendintIntent = PendingIntent.getBroadcast(ctx, 0, intent, 0); 
     registerReceiver(receiver, new IntentFilter(NOTIFICATION_DELETED_ACTION)); 
     Notification n = new Notification.Builder(mContext). 
      setContentText(text). 
      setDeleteIntent(pendintIntent). 
      build(); 
     NotificationManager.notify(0, n); 
    } 
} 
+1

मैं इरादे से सेवा के साथ कोशिश कर रहा हूं। एक अपवाद उद्देश्य प्राप्तकर्ता प्राप्त कर लिया गया है। "क्या आप अनियंत्रित रिसीवर को कॉल खो रहे हैं?" क्या कोई इस पर कोई प्रकाश डाल सकता है? – Yasir

+3

रजिस्टर और पंजीकरण रद्द करने वाले रिसीवर को एक असुरक्षित संदर्भ से कॉल किया जाना चाहिए, इसलिए intentService में getApplicationContext() का उपयोग करके अपनी समस्या का समाधान करना चाहिए। – smora

+1

मैं स्थिर रिसीवर पंजीकृत करने की अनुशंसा करता हूं (उदा। जो AndroidManifest में पंजीकृत है), क्योंकि उस समय उपयोगकर्ता को अधिसूचना खारिज कर दिया जा सकता है। स्टेटिक रिसीवर यह सुनिश्चित करता है कि कोड पहले से ही मर चुका है, भले ही कोड निष्पादित किया जाएगा। – pepyakin

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