web-dev-qa-db-ja.com

Android:アプリがバックグラウンドで実行されているときに通知でAUTO-CANCELを使用する

AUTO-CANCELが機能しない他のすべての質問をここで確認しましたが、それらはすべて、私が犯していない間違いを含んでいるようです。私は両方を試しました

builder.setAutoCancel(true);

そして

Notification notif = builder.build();
notif.flags |= Notification.FLAG_AUTO_CANCEL;

どちらも機能しません。

最小APIが8なので、NotificationCompatを使用しています。これが私の完全なコードです。この特定の通知では、ユーザーに何もする必要がないため、インテントを呼び出していません。

NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentTitle(getString(R.string.app_name) + ": my title");
builder.setContentText(message);
builder.setSmallIcon(R.drawable.notification_icon);

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.prog_icon);
builder.setLargeIcon(bitmap);

builder.setAutoCancel(true); // dismiss notification on user click

NotificationManager notiManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
notiManager.notify(MY_NOTI_MANAGER_ID, builder.build());

通知は完全に表示されます。スワイプしてクリアできます。ただし、タップするだけでは通知は消えません。点灯してそのままです。

私のコードと他のコードとの違いの可能性:1)NotificationCompatを使用しています(違いはないはずですが、以前に聞いたことがあります)。 2)通知が簡単なので、インテントを付けません。

何か洞察があれば教えてください。

編集:私の目的は、バックグラウンドアプリをフォアグラウンドにせずに通知を閉じることです。

19
BeccaP

したがって、明らかにあなたdoは保留中のインテントを必要とします。

Android-通知マネージャー、インテントのない通知がある で、現在アクティブなアプリケーションを保留中のインテントとして取得するソリューションを見つけました(そのために独自のアクティビティを開始する必要はありません)通知を却下します)。

次の2行のコードを追加しました(自動キャンセルの設定直後)。

PendingIntent notifyPIntent = 
    PendingIntent.getActivity(getApplicationContext(), 0, new Intent(), 0);     
builder.setContentIntent(notifyPIntent);

それはうまくいきました。ユーザーが通知をクリックした結果としてアクティビティを再開したくない場合は、これが最良のオプションです。

28
BeccaP

PendingIntentおよびsetContentIntent()呼び出しが欠落しているようです。これは、自動キャンセルが機能するために必要です。

動作する このサンプルプロジェクトNotification- displayingロジックを次に示します。

  private void raiseNotification(Intent inbound, File output, Exception e) {
    NotificationCompat.Builder b=new NotificationCompat.Builder(this);

    b.setAutoCancel(true).setDefaults(Notification.DEFAULT_ALL)
     .setWhen(System.currentTimeMillis());

    if (e == null) {
      b.setContentTitle(getString(R.string.download_complete))
       .setContentText(getString(R.string.fun))
       .setSmallIcon(Android.R.drawable.stat_sys_download_done)
       .setTicker(getString(R.string.download_complete));

      Intent outbound=new Intent(Intent.ACTION_VIEW);

      outbound.setDataAndType(Uri.fromFile(output), inbound.getType());

      b.setContentIntent(PendingIntent.getActivity(this, 0, outbound, 0));
    }
    else {
      b.setContentTitle(getString(R.string.exception))
       .setContentText(e.getMessage())
       .setSmallIcon(Android.R.drawable.stat_notify_error)
       .setTicker(getString(R.string.exception));
    }

    NotificationManager mgr=
        (NotificationManager)getSystemService(NOTIFICATION_SERVICE);

    mgr.notify(NOTIFY_ID, b.build());
  }
6
CommonsWare

特定の時間にキャンセル不可の通知(ユーザーにはキャンセル不可)を表示したい場合は、これを使用できます(音楽プレーヤーなど)。

mNotificationBuilder .setSmallIcon(Android.R.drawable.btn_plus);
mNotificationBuilder .setContentTitle("My notification");
mNotificationBuilder .setContentText("Notificattion From service");
mNotificationBuilder .setLights(0xFF0000FF, 500, 500);

Notification note = mNotificationBuilder.build();  
note.flags = Notification.FLAG_ONGOING_EVENT; // For Non cancellable notification
mNotificationManager.notify(NOTIFICATION_ID, note);
4
Nibin