2012-10-13 9 views
7

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

public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    Log.d(CLASS, "onStartCommand service started."); 

    if (getString(R.string.service_start_action) == intent.getAction()) 
    { 
     Intent intentForeground = new Intent(this, ServiceMain.class) 
      .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);  
     PendingIntent pendIntent = PendingIntent.getActivity(getApplicationContext(), 0, intentForeground, 0);  
     Notification notification; 
     Notification.Builder builder = new Notification.Builder(getApplicationContext()) 
      .setSmallIcon(android.R.drawable.btn_star) 
      .setTicker("Service started...") 
      .setContentIntent(pendIntent) 
      .setDefaults(Notification.DEFAULT_ALL) 
      .setOnlyAlertOnce(true) 
      .setOngoing(false); 
     notification = builder.build(); 
     notification.flags |= Notification.FLAG_FOREGROUND_SERVICE; 

     startForeground(SERV_NOTIFY, notification); 
     player.start(); 
    } 
    else 
    { 
     Log.d(CLASS, "onStartCommand unable to identify acition."); 
    } 

    return START_STICKY;   
} 
+0

Google से इस नमूने को देखें: https://github.com/googlesamples/android-ActiveNotifications। यह दिखाता है कि एक खारिज अधिसूचना के साथ-साथ अधिसूचनाओं के पूरे समूह को कैसे सुनें। –

+0

जहां तक ​​मुझे पता है कि आप अधिसूचना बनाये बिना अग्रभूमि सेवा नहीं बना सकते हैं। एंड्रॉइड की आवश्यकता है क्योंकि वे नहीं चाहते हैं कि आप दृश्य के पीछे सेवाओं को चलाने के बिना उपयोगकर्ता को जानते हों। आपकी गतिविधि नष्ट होने पर अधिसूचना को हटाया जा रहा है और आपकी सेवा अग्रभूमि में चल रही एक अधिसूचना वारंट करती है, आप बस इसे रद्द नहीं कर सकते हैं। अधिसूचना रद्द करना केवल '.stopForeground (true)' के माध्यम से अग्रभूमि सेवा को रद्द करके ही किया जा सकता है, बूलियन पैरामीटर इंगित करता है कि क्या आप अधिसूचना के साथ अग्रभूमि को रोकना चाहते हैं। –

उत्तर

0

वहाँ एक dismissIntent आप, अधिसूचना आपके द्वारा बनाए गए में सेट कर सकते हैं, हालांकि मैं अग्रभूमि सेवा सूचनाएं सोचा साफ नहीं किया जा सकता है:

अधिसूचना के कार्यान्वयन शामिल करने के लिए अपडेट किया गया?

+0

एक 'बर्खास्तगी' है? वह एपीआई स्पेक कहां है? –

+0

@IgorGanapolsky NotificationCompat.Builder # setDeleteIntent (...) – Dogcat

+0

@Dogcat मैं नहीं दिख रहा है ** dismissIntent ** एपीआई में कहीं भी। –

4

एक अग्रगण्य सेवा की अधिसूचना को मंजूरी नहीं दी जा सकती है। एकमात्र तरीका सेवा को रोक रहा है।

तो मैं उस मुद्दे को हल करता हूं जिसे आप हल करना चाहते हैं, कभी नहीं होगा।

3

मेरा सवाल यह है कि, "सभी अधिसूचनाएं साफ़ करें" या अधिसूचना (स्वाइप) की खारिज होने पर सेवा को रोकने का कोई तरीका है?

यह मानते हुए कि आपके Notification यह हटाए जाने की जब यह साफ़ हो जाता है the deleteIntent लागू किया जाना चाहिए की अनुमति देने के लिए तैयार है। आप इसे getBroadcast()PendingIntent पर सेट कर सकते हैं, जो एक मेनिफेस्ट-पंजीकृत BroadcastReceiver पर इंगित करता है जो stopService() पर कॉल करता है।

+0

धन्यवाद, यह मेरी प्रारंभिक दृष्टिकोण जा रहा था, लेकिन एक बार सेवा की अधिसूचना सूचना पट्टी में है, वहाँ कोई 'स्पष्ट सभी सूचनाएं' बटन और कड़ी चोट की क्षमता को खारिज करने के अक्षम होने लगता है। –

+0

@moncadad: अपने प्रश्न संपादित करें, कोड जहां 'Notification' पैदा कर रहे पोस्ट करें, और यहाँ वापस टिप्पणी मुझे पता है कि आप इसे पोस्ट करते हैं। – CommonsWare

+0

अधिसूचना कार्यान्वयन को शामिल करने के लिए अद्यतन किया गया। –

6

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

इसलिए, stopForeground(false) पहले, जो अधिसूचना को उसके बाद उपयोगकर्ता द्वारा स्वाइप करने की अनुमति देता है (कम से कम लॉलीपॉप +)। प्री-लॉलीपॉप के लिए, आपको stopForeground(true) हो सकता है, जो अग्रभूमि को रोकता है और अधिसूचना को हटा देता है, फिर अधिसूचना प्रबंधक के साथ अधिसूचना को फिर से जारी करें। नोटिफ़ाई (yourNotificationID, yourNotificationObject), ताकि आपकी सूचना दिखाई दे लेकिन स्वाइप करने योग्य हो।

महत्वपूर्ण रूप से, जब उपयोगकर्ता इसे हटा देता है तो ट्रिगर होने पर एक विवाद उद्देश्य के साथ अधिसूचना ऑब्जेक्ट सेट अप करें।

(new NotificationCompat.builder(this).setDeleteIntent(deletePendingIntent)).build() 

जहां deletePendingIntent

Intent deleteIntent = new Intent(this, YourService.class); 
deleteIntent.putExtra(someKey, someIntValue); 
PendingIntent deletePendingIntent = PendingIntent.getService(this, 
someIntValue, 
deleteIntent, 
PendingIntent.FLAG_CANCEL_CURRENT); 

की तरह कुछ है उपयोगकर्ता इसे दूर स्वाइप करते हैं, इसके अतिरिक्त के साथ आशय सेवा के लिए दिया जाता है। onStartCommand के भीतर वितरित अतिरिक्त को संभालें, यानी intent != null, intent.getExtras() != null जांचें, फिर someKey दिए गए अतिरिक्त बंडल से मान निकालें, और यदि यह someIntValue से मेल खाता है, तो stopSelf() पर कॉल करें।

+0

मैं startForeground (गलत) का इस्तेमाल किया था लेकिन मैं यह भी मेरी NotificationBuilder कोड से .setOngoing (सही) का कॉल निकालना पड़ा – caitoo0o

1

इस कोड को मेरे लिए काम करता है:

this.stopForeground(false); 
mNotificationManager.cancel(NOTIFY_ID); 

और आप onStartCommand की अपनी वापसी मान निर्धारित करना चाहिए, STRAT_STICKY आपकी सेवा पुनः आरंभ करेगा।