169

APIレベル16(Jelly Bean)以降、通知にアクションを追加する可能性があります。

builder.addAction(iconId, title, intent);

しかし、通知にアクションを追加してアクションが押された場合、通知は却下されません。通知自体がクリックされている場合、通知を閉じることができます

notification.flags = Notification.FLAG_AUTO_CANCEL;

また

builder.setAutoCancel(true);

しかし、明らかに、これは通知に関連するアクションとは何の関係もありません。

ヒントはありますか?それとも、これはまだAPIの一部ではありませんか?何も見つかりませんでした。

4

9 に答える 9

175

通知マネージャーでnotifyを呼び出したときに、IDを指定しました。これは後でアクセスするために使用できる一意のIDです(これは通知マネージャーからのものです。

notify(int id, Notification notification)

キャンセルするには、次の電話番号に電話してください。

cancel(int id)

同じIDで。したがって、基本的には、IDを追跡する必要がありますか、それとも、PendingIntent内のインテントに追加するバンドルにIDを入れる必要がありますか?

于 2012-08-09T13:15:23.183 に答える
68

Lollipopのヘッドアップディスプレイ通知を使用するときに、これが問題であることがわかりました。設計ガイドラインを参照してください。実装する完全な(ish)コードは次のとおりです。

これまで、[閉じる]ボタンを使用することはそれほど重要ではありませんでしたが、今ではもっと重要になっています。

ヘッドアップ通知

通知の作成

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

    @Override
    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(SystemUIがバックスタックにフォーカスするのを防ぐために必要な属性)

<activity
    android:name=".NotificationActivity"
    android:taskAffinity=""
    android:excludeFromRecents="true">
</activity>
于 2014-11-22T23:38:11.253 に答える
19

拡張通知でアクションボタンを使用する場合、追加のコードを記述する必要があり、より制約があることがわかりました。

ユーザーがアクションボタンをクリックしたときに、通知を手動でキャンセルする必要があります。通知は、デフォルトのアクションに対してのみ自動的にキャンセルされます。

また、ボタンから放送受信機を起動しても、通知ドロワーは閉じません。

これらの問題に対処するために、新しいNotificationActivityを作成することになりました。UIを使用しないこの中間アクティビティは、通知をキャンセルしてから、通知から本当に開始したかったアクティビティを開始します。

関連する投稿にサンプルコードを投稿しましたAndroidの通知アクションをクリックしても通知ドロワーは閉じません

于 2014-02-14T15:36:07.533 に答える
9

私の意見では、を使用するBroadcastReceiverことは通知をキャンセルするためのよりクリーンな方法です。

AndroidManifest.xmlの場合:

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

Javaファイルの場合:

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

NotificationCancelReceiver

public class NotificationCancelReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //Cancel your ongoing Notification
    };
}
于 2015-08-02T14:24:08.420 に答える
8

通知を削除するためにインテントが実行された後、次のコードを実行する必要があります。

NotificationManagerCompat.from(this).cancel(null, notificationId);

注意:notificationIdは、通知を実行するために渡されるIDと同じです

于 2020-04-28T15:00:50.423 に答える
7

アクションによって呼び出されているものは何でも(たとえば、提供先に関連付けられているアクティビティcancel()の)からいつでも実行できます。NotificationonCreate()PendingIntentaddAction()

于 2012-08-09T12:44:27.567 に答える
7

新しいAPIでは、TAGを忘れないでください。

notify(String tag, int id, Notification notification)

それに対応して

cancel(String tag, int id) 

それ以外の:

cancel(int id)

https://developer.android.com/reference/android/app/NotificationManager

于 2018-11-14T11:02:10.510 に答える
4

この行を置くだけです:

 builder.setAutoCancel(true);

そして完全なコードは:

NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    builder.setSmallIcon(android.R.drawable.ic_dialog_alert);
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.co.in/"));
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
    builder.setContentIntent(pendingIntent);
    builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.misti_ic));
    builder.setContentTitle("Notifications Title");
    builder.setContentText("Your notification content here.");
    builder.setSubText("Tap to view the website.");
    Toast.makeText(getApplicationContext(), "The notification has been created!!", Toast.LENGTH_LONG).show();

    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    builder.setAutoCancel(true);
    // Will display the notification in the notification bar
    notificationManager.notify(1, builder.build());
于 2018-03-13T13:14:55.737 に答える
-3

builder.setAutoCancel(true);

Android9でもテスト済み。

于 2020-04-09T09:09:52.220 に答える