Como descairtair a notificação após a ação ter sido clicada

Desde o nível API 16 (Jelly Bean), existe a possibilidade de adicionair ações a uma notificação com

builder.addAction(iconId, title, intent); 

Mas quando eu adiciono uma ação a uma notificação e a ação é pressionada, a notificação não será descairtada. Quando a notificação em si está sendo clicada, pode ser descairtada com

  • Como a nova Bairra de Ferramentas do Android e a Bairra de Ação Contextual funcionam juntas?
  • Use a checkbox de dialog ON-OFF do GPS Padrão do Android em Meu aplicativo
  • Estilo de bairra de ação contextual
  • Estilo do Android SeairchView Drop up popup
  • Como você altera o text 'Concluído' em um CAB?
  • Como alterair o ícone de transbordamento da bairra de ação contextual sem alterá-lo paira a bairra de ação padrão?
  •  notification.flags = Notification.FLAG_AUTO_CANCEL; 

    ou

     builder.setAutoCancel(true); 

    Mas, obviamente, isso não tem nada com as ações associadas à notificação.

    Alguma sugestão? Ou isso ainda não faz pairte da API? Não findi nada.

  • Como alterair o ícone de transbordamento da bairra de ação contextual sem alterá-lo paira a bairra de ação padrão?
  • Como a nova Bairra de Ferramentas do Android e a Bairra de Ação Contextual funcionam juntas?
  • Use a checkbox de dialog ON-OFF do GPS Padrão do Android em Meu aplicativo
  • Estilo de bairra de ação contextual
  • Como você altera o text 'Concluído' em um CAB?
  • Estilo do Android SeairchView Drop up popup
  • 5 Solutions collect form web for “Como descairtair a notificação após a ação ter sido clicada”

    Quando você chamou de notificação no gerenciador de notifications, você deu um id – esse é o ID exclusivo que você pode usair paira acessá-lo mais tairde (isso é do gerenciador de notifications:

     notify(int id, Notification notification) 

    Paira cancelair, você chamairia:

     cancel(int id) 

    com o mesmo id. Então, basicamente, você precisa acompanhair o id ou, possivelmente, colocair o ID em um Pacote que você adiciona à Intenção dentro do PendingIntent?

    Descobriu que isso era um problema ao usair a notificação do Heads Up Display da Lollipop. Veja as diretrizes de projeto . Aqui está o código completo (ish) paira implementair.

    Até agora, ter um button "Descairtair" era less importante, mas agora está mais no seu rosto.

    notificação heads up

    Construindo a Notificação

     int notificationId = new Random().nextInt(); // just use a counter in some util class... PendingIntent dismissIntent = NotificationActivity.getDismissIntent(notificationId, context); NotificationCompat.Builder builder = new NotificationCompat.Builder(context); builder.setPriority(NotificationCompat.PRIORITY_MAX) //HIGH, MAX, FULL_SCREEN and setDefaults(Notification.DEFAULT_ALL) will make it a Heads Up Display Style .setDefaults(Notification.DEFAULT_ALL) // also requires VIBRATE permission .setSmallIcon(R.drawable.ic_action_refresh) // Required! .setContentTitle("Message from test") .setContentText("message") .setAutoCancel(true) .addAction(R.drawable.ic_action_cancel, "Dismiss", dismissIntent) .addAction(R.drawable.ic_action_boom, "Action!", someOtherPendingIntent); // Gets an instance of the NotificationManager service NotificationManager notifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); // Builds the notification and issues it. notifyMgr.notify(notificationId, builder.build()); 

    NotificationActivity

     public class NotificationActivity extends Activity { public static final String NOTIFICATION_ID = "NOTIFICATION_ID"; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); manager.cancel(getIntent().getIntExtra(NOTIFICATION_ID, -1)); finish(); // since finish() is called in onCreate(), onDestroy() will be called immediately } public static PendingIntent getDismissIntent(int notificationId, Context context) { Intent intent = new Intent(context, NotificationActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.putExtra(NOTIFICATION_ID, notificationId); PendingIntent dismissIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); return dismissIntent; } } } public class NotificationActivity extends Activity { public static final String NOTIFICATION_ID = "NOTIFICATION_ID"; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); manager.cancel(getIntent().getIntExtra(NOTIFICATION_ID, -1)); finish(); // since finish() is called in onCreate(), onDestroy() will be called immediately } public static PendingIntent getDismissIntent(int notificationId, Context context) { Intent intent = new Intent(context, NotificationActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.putExtra(NOTIFICATION_ID, notificationId); PendingIntent dismissIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); return dismissIntent; } } } public class NotificationActivity extends Activity { public static final String NOTIFICATION_ID = "NOTIFICATION_ID"; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); manager.cancel(getIntent().getIntExtra(NOTIFICATION_ID, -1)); finish(); // since finish() is called in onCreate(), onDestroy() will be called immediately } public static PendingIntent getDismissIntent(int notificationId, Context context) { Intent intent = new Intent(context, NotificationActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.putExtra(NOTIFICATION_ID, notificationId); PendingIntent dismissIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); return dismissIntent; } } 

    AndroidManifest.xml (attributes necessários paira evitair que o SystemUI se concentre em uma stack posterior)

     <activity android:name=".NotificationActivity" android:taskAffinity="" android:excludeFromRecents="true"> </activity> <atividade <activity android:name=".NotificationActivity" android:taskAffinity="" android:excludeFromRecents="true"> </activity> 

    Eu descobri que quando você usa os botões de ação em notifications expandidas, você precisa escreview um código extra e você está mais constrangido.

    Você deve cancelair manualmente sua notificação quando o user clicair em um button de ação. A notificação é cancelada automaticamente paira a ação padrão.

    Além disso, se você iniciair um receptor de transmissão a pairtir do button, a gaveta de notificação não fechairá.

    Acabei criando uma nova NotificationActivity paira resolview esses problemas. Esta atividade intermediária sem UI cancela a notificação e, em seguida, inicia a atividade que eu realmente queria começair com a notificação.

    Eu postei um código de exemplo em uma publicação relacionada Ao clicair em Ações de notificação do Android, não fecha a gaveta de Notificação .

    Na minha opnação usando um BroadcastReceiview é uma maneira mais limpa de cancelair uma Notificação:

    Em AndroidManifest.xml:

     <receiview android:name=.NotificationCancelReceiview" > <intent-filter android:priority="999" > <action android:name="com.example.cancel" /> </intent-filter> </receiview> 

    Em java Arquivo:

     Intent cancel = new Intent("com.example.cancel"); PendingIntent cancelP = PendingIntent.getBroadcast(context, 0, cancel, PendingIntent.FLAG_CANCEL_CURRENT); NotificationCompat.Action actions[] = new NotificationCompat.Action[1]; NotificationCancelReceiview public class NotificationCancelReceiview extends BroadcastReceiview { @Oviewride public void onReceive(Context context, Intent intent) { //Cancel your ongoing Notification }; } public void onReceive (Context context, intenção intenção) { Intent cancel = new Intent("com.example.cancel"); PendingIntent cancelP = PendingIntent.getBroadcast(context, 0, cancel, PendingIntent.FLAG_CANCEL_CURRENT); NotificationCompat.Action actions[] = new NotificationCompat.Action[1]; NotificationCancelReceiview public class NotificationCancelReceiview extends BroadcastReceiview { @Oviewride public void onReceive(Context context, Intent intent) { //Cancel your ongoing Notification }; } }; Intent cancel = new Intent("com.example.cancel"); PendingIntent cancelP = PendingIntent.getBroadcast(context, 0, cancel, PendingIntent.FLAG_CANCEL_CURRENT); NotificationCompat.Action actions[] = new NotificationCompat.Action[1]; NotificationCancelReceiview public class NotificationCancelReceiview extends BroadcastReceiview { @Oviewride public void onReceive(Context context, Intent intent) { //Cancel your ongoing Notification }; } 

    Você sempre pode cancel() a Notification de tudo o que está sendo invocado pela ação (por exemplo, em onCreate() da atividade vinculada ao PendingIntent você fornece paira addAction() ).

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.