스 와이프하여 이벤트 닫기


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);사용자가 알림을 클릭하고 취소 될 때 알림에 대한 유사한 접근 방식이 있는지 궁금합니다 . delete-Intent가 트리거되지 않습니다
devanshu_kaushik


그래 잘 작동하지만 Oreo 이상 API에서는 작동하지 않습니다. 오레오를 위해 제발 도와주세요
피터

@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) 보류중인 인 텐트에 대한 고유 ID를 사용하여 보류중인 인 텐트를 생성합니다 (여기에서 알림 ID가 사용됨). 이렇게하지 않으면 각 해제 이벤트에 대해 동일한 추가 항목이 재사용됩니다.

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

나를 위해 일하지 않았고 항상 "수신자를 인스턴스화 할 수 없습니다 .... 0 인수 생성자가 없습니다"라는 오류가 발생했습니다. 다른 유사한 솔루션을 구현 한 후에 만 ​​해결되었지만 브로드 캐스트 수신기 등록 : stackoverflow.com/questions/13028122/…
Alexeev Valeriy

이것은 나를 위해 작동하지만 알림을 클릭하면 이벤트를 호출 할 수 없습니다. 클릭 이벤트를 수신하려면 어떻게해야합니까?
Allen Vork 2016 년

문서에 따르면를 사용 setAutoCancel(true)하면 클릭시 알림이 취소되고 삭제 인 텐트도 브로드 캐스트됩니다 [ developer.android.com/reference/android/support/v4/app/…
sven

이는 매개 변수 전달을 제외하고는 작동합니다. intent.getExtras ()는 extras가 설정되어 있어도 항상 null을 반환합니다. 작동하려면 다음과 같이 작업을 설정해야합니다. resultIntent.setAction (unique_action);
lxknvlk dec.

0

또 다른 아이디어 :

일반적으로 알림을 생성하는 경우 하나, 둘 또는 세 가지 작업도 필요합니다. "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;
}

그리고 (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.