จับรูดเพื่อปิดกิจกรรม


85

ฉันใช้การแจ้งเตือนของ Android เพื่อแจ้งเตือนผู้ใช้เมื่อบริการเสร็จสิ้น (สำเร็จหรือล้มเหลว) และฉันต้องการลบไฟล์ในเครื่องเมื่อกระบวนการเสร็จสิ้น

ปัญหาของฉันคือในกรณีที่ล้มเหลว - ฉันต้องการให้ผู้ใช้มีตัวเลือก "ลองใหม่" และถ้าเขาเลือกที่จะไม่ลองอีกครั้งและปิดการแจ้งเตือนฉันต้องการลบไฟล์ในเครื่องที่บันทึกไว้เพื่อวัตถุประสงค์ของกระบวนการ (ภาพ ... )

มีวิธีจับเหตุการณ์ปัดเพื่อปิดการแจ้งเตือนหรือไม่

คำตอบ:


145

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);เพราะเมื่อผู้ใช้คลิกการแจ้งเตือนและถูกยกเลิกการลบ - เจตนาจะไม่ถูกเรียก
devanshu_kaushik


@Peter เพื่อให้มันทำงานใน Oreo และ Obove คุณต้องเพิ่มโค้ดบรรทัดนี้: Notification note = builder.build (); note.flags | = Notification.FLAG_AUTO_CANCEL;
Dimas Mendes

86

คำตอบที่ล้างออกอย่างสมบูรณ์ (ขอบคุณ Mr. Me สำหรับคำตอบ):

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/…
Alexeev Valeriy

สิ่งนี้ใช้ได้กับฉัน แต่ไม่สามารถเรียกเหตุการณ์เมื่อคุณคลิกการแจ้งเตือนฉันจะฟังเหตุการณ์คลิกได้อย่างไร
Allen Vork

ตามเอกสารหากคุณใช้setAutoCancel(true)การแจ้งเตือนจะถูกยกเลิกเมื่อคลิกและยังเผยแพร่เจตนาในการลบ [ developer.android.com/reference/android/support/v4/app/…
เวน

สิ่งนี้ใช้งานได้ยกเว้นการส่งผ่านพารามิเตอร์ Intent.getExtras () จะคืนค่า null เสมอแม้ว่าจะตั้งค่าส่วนเสริม เพื่อให้ใช้งานได้คุณต้องตั้งค่าการกระทำดังนี้ resultIntent.setAction (unique_action);
lxknvlk

0

แนวคิดอื่น:

หากคุณสร้างการแจ้งเตือนตามปกติคุณต้องดำเนินการหนึ่งสองหรือ 3 รายการ ฉันได้สร้าง "NotifyManager" มันสร้างการแจ้งเตือนทั้งหมดที่ฉันต้องการและยังรับสาย Intent ทั้งหมด ดังนั้นฉันจึงสามารถจัดการการกระทำทั้งหมดและจับเหตุการณ์การเลิกจ้างได้ในที่เดียว

public class NotifyPerformService extends IntentService {

@Inject NotificationManager notificationManager;

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

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

ในการสร้าง deleteIntent ให้ใช้สิ่งนี้ (ใน 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;
}

และฉันใช้เพื่อตั้งค่า Intent การลบเช่นนี้ (ใน NotificationManager):

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;
}

และสุดท้ายใน NotificationManager เดียวกันคือฟังก์ชันการทำงาน:

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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.