bắt vuốt để loại bỏ sự kiện


85

Tôi đang sử dụng thông báo Android để cảnh báo người dùng sau khi dịch vụ kết thúc (thành công hay thất bại) và tôi muốn xóa các tệp cục bộ sau khi quá trình hoàn tất.

Vấn đề của tôi là trong trường hợp không thành công - tôi muốn cho người dùng tùy chọn "thử lại". và nếu anh ta chọn không thử lại và loại bỏ thông báo, tôi muốn xóa các tệp cục bộ được lưu cho mục đích xử lý (hình ảnh ...).

Có cách nào để nắm bắt sự kiện vuốt để loại bỏ của thông báo không?

Câu trả lời:


144

DeleteIntent : DeleteIntent là một đối tượng PendingIntent có thể được liên kết với thông báo và được kích hoạt khi thông báo bị xóa, ether bằng cách:

  • Hành động cụ thể của người dùng
  • Người dùng Xóa tất cả các thông báo.

Bạn có thể đặt Ý định đang chờ xử lý thành Bộ thu phát sóng và sau đó thực hiện bất kỳ hành động nào bạn muốn.

  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
Đây là muộn. Tôi chỉ đang tự hỏi liệu có một cách tiếp cận tương tự cho các thông báo xảy ra builder.setAutoCancel(true);khi người dùng nhấp vào thông báo và thông báo đó bị hủy hay không, xóa-Intent không được kích hoạt
devanshu_kaushik


Yeah Nó hoạt động tốt nhưng không phải trong API Oreo trở lên. Xin hãy giúp tôi về Oreo
Peter.

@Peter Để nó hoạt động trong Oreo và Obove, bạn cần thêm dòng mã này: Notification note = builder.build (); note.flags | = Notification.FLAG_AUTO_CANCEL;
Dimas Mendes,

86

Một câu trả lời tuôn ra đầy đủ (với lời cảm ơn đến anh Tôi vì câu trả lời):

1) Tạo bộ thu để xử lý sự kiện vuốt để loại bỏ:

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) Thêm mục nhập vào tệp kê khai của bạn:

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

3) Tạo ý định đang chờ xử lý bằng cách sử dụng id duy nhất cho ý định đang chờ xử lý (id thông báo được sử dụng ở đây) vì nếu không có điều này, các tính năng bổ sung tương tự sẽ được sử dụng lại cho mỗi sự kiện loại bỏ:

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) Xây dựng thông báo của bạn:

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

Không hoạt động với tôi, luôn dẫn đến lỗi "Không thể khởi tạo bộ thu .... không có hàm tạo đối số 0". Giải quyết chỉ sau khi tôi đã thực hiện một giải pháp tương tự nhưng với đăng ký của máy thu phát sóng: stackoverflow.com/questions/13028122/...
Alexeev Valeriy

Điều này phù hợp với tôi, nhưng không thể gọi sự kiện khi bạn nhấp vào thông báo. Làm thế nào tôi có thể nghe sự kiện nhấp chuột?
Allen Vork

Theo tài liệu, nếu bạn sử dụng setAutoCancel(true), thì thông báo sẽ bị hủy khi được nhấp và cũng phát đi ý định xóa [ developer.android.com/reference/android/support/v4/app/…
sven

Điều này hoạt động, ngoại trừ việc truyền tham số, ý định.getExtras () luôn trả về null, ngay cả khi các phần bổ sung được đặt. Để nó hoạt động, bạn phải thiết lập hành động như sau: resultIntent.setAction (unique_action);
lxknvlk

0

Một ý tưởng khác:

nếu bạn tạo một thông báo bình thường, bạn cũng cần thực hiện một, hai hoặc 3 trong số chúng. Tôi đã tạo một "NotifyManager", nó tạo ra tất cả các thông báo tôi cần và cũng nhận tất cả các cuộc gọi Intent. Vì vậy, tôi có thể quản lý tất cả các hành động VÀ cũng có thể nắm bắt sự kiện loại bỏ tại MỘT nơi.

public class NotifyPerformService extends IntentService {

@Inject NotificationManager notificationManager;

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

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

để tạo deleteIntent, hãy sử dụng cái này (trong 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;
}

và RẰNG tôi sử dụng để đặt Ý định xóa như thế này (trong Trình quản lý thông báo):

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

và cuối cùng trong cùng NotificationManager là chức năng thực hiện:

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
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.