抓住滑动来解散事件
我正在使用一个android通知来提醒用户,一旦服务完成(成功或失败),我想删除本地文件一旦完成过程。
我的问题是,如果发生故障 – 我想让用户“重试”选项。 如果他select不重试并解除通知,我想删除为进程保存的本地文件(图像…)。
有没有办法赶上通知的刷卡 – 解雇事件?
DeleteIntent :DeleteIntent是一个PendingIntent对象,可以与通知关联,并在通知被删除时被触发。
- 用户特定的操作
- 用户删除所有通知。
您可以将Pending Intent设置为广播接收器,然后执行所需的任何操作。
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 } }
一个完全冲动的答案(感谢我先生的回答):
1)创build一个接收器来处理滑动到解散事件:
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)使用唯一的待处理意图标识(在这里使用通知标识)创build待处理意向,因为没有这些相同的附加function将被重新用于每个解雇事件:
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)build立你的通知:
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);
另一个想法:
如果您正常创build通知,则还需要其中的一个,两个或三个操作。 我创build了一个“NotifyManager”它创build我需要的所有通知,并且还接收所有的意图调用。 所以我可以pipe理所有的行动,也可以在一个地方赶上解雇事件。
public class NotifyPerformService extends IntentService { @Inject NotificationManager notificationManager; public NotifyPerformService() { super("NotifyService"); ...//some Dagger stuff } @Override public void onHandleIntent(Intent intent) { notificationManager.performNotifyCall(intent); }
创builddeleteIntent使用这个(在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 }