घटना को खारिज करने के लिए ज़ोर से मारना


85

एक सेवा (सफलता या विफलता) समाप्त होने के बाद उपयोगकर्ता को सचेत करने के लिए मैं एक Android अधिसूचना का उपयोग कर रहा हूं, और प्रक्रिया पूरी होने के बाद मैं स्थानीय फ़ाइलों को हटाना चाहता हूं।

मेरी समस्या यह है कि विफलता की स्थिति में - मैं उपयोगकर्ता को "पुनः प्रयास" विकल्प देना चाहता हूं। और अगर वह पीछे हटने का विकल्प नहीं चुनता है और मैं अधिसूचना को खारिज करना चाहता हूं तो प्रक्रिया के प्रयोजनों (छवियों ...) के लिए बचाई गई स्थानीय फ़ाइलों को हटाना चाहते हैं।

क्या अधिसूचना के स्वाइप-टू-बर्खास्त करने की घटना को पकड़ने का कोई तरीका है?

जवाबों:


144

DeleteIntent : DeleteIntent एक PendingIntent ऑब्जेक्ट है, जो नोटिफिकेशन के साथ जुड़ा हो सकता है और नोटिफिकेशन डिलीट होने पर निकाल दिया जाता है, इसके द्वारा ईथर:

  • उपयोगकर्ता विशिष्ट कार्रवाई
  • उपयोगकर्ता सभी सूचनाएं हटाएं।

आप एक प्रसारण प्राप्तकर्ता के लिए लंबित आशय सेट कर सकते हैं और फिर अपनी इच्छानुसार कोई भी कार्य कर सकते हैं।

  Intent intent = new Intent(this, MyBroadcastReceiver.class);
  PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, 0);
  Builder builder = new Notification.Builder(this):
 ..... code for your notification
  builder.setDeleteIntent(pendingIntent);

MyBroadcastReceiver

public class MyBroadcastReceiver extends BroadcastReceiver {
      @Override
      public void onReceive(Context context, Intent intent) {
             .... code to handle cancel
         }

  }

8
यह देर हो चुकी है। मैं बस सोच रहा था कि क्या सूचनाओं के लिए एक समान दृष्टिकोण है जो builder.setAutoCancel(true);किसी उपयोगकर्ता द्वारा अधिसूचना पर क्लिक करने पर
becuase

1
@dev_android चेकआउट डेवलपर
।android.com

हाँ, यह ठीक काम कर रहा है लेकिन Oreo और API के ऊपर नहीं। कृपया ओरेओ
पीटर

@ पेटर ओरेओ और ओबोव में काम करने के लिए इसे कोड की इस पंक्ति को जोड़ने की आवश्यकता है: अधिसूचना नोट = बिल्डर.बिल्ट (); note.flags | = Notification.FLAG_AUTO_CANCEL;
डिमास मेंडेस

86

एक पूरी तरह से निकला हुआ जवाब (उत्तर के लिए श्री मी के लिए धन्यवाद):

1) स्वाइप-टू-बर्खास्त घटना को संभालने के लिए एक रिसीवर बनाएं:

public class NotificationDismissedReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
      int notificationId = intent.getExtras().getInt("com.my.app.notificationId");
      /* Your code to handle the event here */
  }
}

2) अपने प्रदर्शन में एक प्रविष्टि जोड़ें:

<receiver
    android:name="com.my.app.receiver.NotificationDismissedReceiver"
    android:exported="false" >
</receiver>

3) लंबित इरादे के लिए एक अद्वितीय आईडी का उपयोग करके लंबित इरादे बनाएं (अधिसूचना आईडी का उपयोग यहां किया गया है) क्योंकि इसके बिना एक ही एक्स्ट्रा को प्रत्येक बर्खास्तगी की घटना के लिए पुन: उपयोग किया जाएगा:

private PendingIntent createOnDismissedIntent(Context context, int notificationId) {
    Intent intent = new Intent(context, NotificationDismissedReceiver.class);
    intent.putExtra("com.my.app.notificationId", notificationId);

    PendingIntent pendingIntent =
           PendingIntent.getBroadcast(context.getApplicationContext(), 
                                      notificationId, intent, 0);
    return pendingIntent;
}

4) अपनी अधिसूचना बनाएँ:

Notification notification = new NotificationCompat.Builder(context)
              .setContentTitle("My App")
              .setContentText("hello world")
              .setWhen(notificationTime)
              .setDeleteIntent(createOnDismissedIntent(context, notificationId))
              .build();

NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(notificationId, notification);

मेरे लिए काम नहीं किया, हमेशा त्रुटि के परिणामस्वरूप "त्वरित रिसीवर के लिए असमर्थ .... कोई शून्य तर्क निर्माता नहीं है"। हल करने के बाद ही मैंने एक और समान समाधान लागू किया है, लेकिन प्रसारण रिसीवर के पंजीकरण के साथ: stackoverflow.com/questions/13028122/…
अलेक्सिएव वेलेरी

यह मेरे लिए काम करता है। लेकिन जब आप सूचना पर क्लिक करते हैं तो घटना को लागू नहीं किया जा सकता। मैं क्लिक इवेंट कैसे सुन सकता हूं?
एलन वॉर्क

डॉक्स के अनुसार, यदि आप उपयोग करते हैं setAutoCancel(true), तो अधिसूचना को क्लिक करने पर रद्द कर दिया जाएगा और हटाए जाने के इरादे को भी प्रसारित करेगा [ डेवलपर.
android.com/reference/android/support/v4/app/…

यह काम करता है, पैरामीटर को छोड़कर, आशय ।getExtras () हमेशा अशक्त रिटर्न देता है, भले ही अतिरिक्त सेट हो। इसे काम करने के लिए, आपको एक्शन सेट करना होगा: resultIntent.setAction (unique_action);
lxknvlk

0

एक अन्य विचार:

यदि आप एक अधिसूचना बनाते हैं तो आपको सामान्य रूप से उनमें से एक, दो या 3 क्रियाओं की आवश्यकता होती है। मैंने एक "NotifyManager" बनाया है, यह मेरी ज़रूरत की सभी सूचनाएं बनाता है और सभी इंटेंट कॉल भी प्राप्त करता है। इसलिए मैं सभी कार्यों का प्रबंधन कर सकता हूं और एक स्थान पर बर्खास्तगी की घटना को भी पकड़ सकता हूं।

public class NotifyPerformService extends IntentService {

@Inject NotificationManager notificationManager;

public NotifyPerformService() {
    super("NotifyService");
    ...//some Dagger stuff
}

@Override
public void onHandleIntent(Intent intent) {
    notificationManager.performNotifyCall(intent);
}

डिलीट को बनाने के लिए इसे उपयोग करें (NotificationManager में):

private PendingIntent createOnDismissedIntent(Context context) {
    Intent          intent          = new Intent(context, NotifyPerformMailService.class).setAction("ACTION_NOTIFY_DELETED");
    PendingIntent   pendingIntent   = PendingIntent.getService(context, SOME_NOTIFY_DELETED_ID, intent, 0);

    return pendingIntent;
}

और मुझे इस तरह से हटाने की अधिसूचना सेट करने के लिए उपयोग करना है (अधिसूचना प्रबंधक में):

private NotificationCompat.Builder setNotificationStandardValues(Context context, long when){
    String                          subText = "some string";
    NotificationCompat.Builder      builder = new NotificationCompat.Builder(context.getApplicationContext());


    builder
            .setLights(ContextUtils.getResourceColor(R.color.primary) , 1800, 3500) //Set the argb value that you would like the LED on the device to blink, as well as the rate
            .setAutoCancel(true)                                                    //Setting this flag will make it so the notification is automatically canceled when the user clicks it in the panel.
            .setWhen(when)                                                          //Set the time that the event occurred. Notifications in the panel are sorted by this time.
            .setVibrate(new long[]{1000, 1000})                                     //Set the vibration pattern to use.

            .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
            .setSmallIcon(R.drawable.ic_white_24dp)
            .setGroup(NOTIFY_GROUP)
            .setContentInfo(subText)
            .setDeleteIntent(createOnDismissedIntent(context))
    ;

    return builder;
}

और अंत में एक ही अधिसूचना प्रबंधक में प्रदर्शन कार्य है:

public void performNotifyCall(Intent intent) {
    String  action  = intent.getAction();
    boolean success = false;

    if(action.equals(ACTION_DELETE)) {
        success = delete(...);
    }

    if(action.equals(ACTION_SHOW)) {
        success = showDetails(...);
    }

    if(action.equals("ACTION_NOTIFY_DELETED")) {
        success = true;
    }


    if(success == false){
        return;
    }

    //some cleaning stuff
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.