解雇后单挑通知卡在全屏模式

Heads-Up notification stuck in full-screen mode after dismissal

我看到一些关于正在进行的 heads-up notifications 的奇怪行为,这些行为由全屏意图支持。给定两个活动,MainActivity 仅包含一个用于显示通知的按钮:

public class MainActivity extends AppCompatActivity {
    private static final String CHANNEL  = "TestChannel";
    public static final int NOTIFICATION_ID = 1;
    private static final int REQUEST_CODE = 2;

    private NotificationManager notificationManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.notificationManager = getSystemService(NotificationManager.class);
        Button showNotification = findViewById(R.id.show_notification);

        ensureNotificationChannelCreated();
        showNotification.setOnClickListener(v -> notificationManager.notify(NOTIFICATION_ID, createNotification()));
    }

    @TargetApi(O) private void ensureNotificationChannelCreated() {
        if (SDK_INT >= O) {
            NotificationChannel incoming = new NotificationChannel(CHANNEL, "Channel Name", NotificationManager.IMPORTANCE_HIGH);
            notificationManager.createNotificationChannel(incoming);
        }
    }

    public Notification createNotification() {
        Intent intent = new Intent(this, ContentActivity.class);
        PendingIntent pi = PendingIntent.getActivity(this, REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        return new NotificationCompat.Builder(this, CHANNEL)
                .setContentText("Test notification")
                .setSmallIcon(R.drawable.ic_launcher_foreground)
                .setContentIntent(pi)
                .setFullScreenIntent(pi, true)
                .setOngoing(true)
                .setPriority(NotificationCompat.PRIORITY_HIGH)
                .build();
    }
}

以及全屏意图提供的Activity,ContentActivity

public class ContentActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_content);

        NotificationManager notificationManager = getSystemService(NotificationManager.class);    
        notificationManager.cancel(NOTIFICATION_ID);
    }
}

我希望在随后的按钮点击中仍显示提示通知,即使之前已向上滑动通知。是否还有我遗漏的任何其他标志或设置?

Android 用来选择全屏 activity 而不是单挑通知的过程似乎有点不透明。 From the documentation(我的粗体):

An intent to launch instead of posting the notification to the status bar.

The system UI may choose to display a heads-up notification, instead of launching this intent, while the user is using the device.

似乎没有关于如何做出此决定的任何文档。我发现的唯一解决方法是确保每个通知都发布给具有不同 ID 的经理。所以在 MainActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...

    Random random = new Random(System.currentTimeMillis());
    showNotification.setOnClickListener(v -> {
         int notificationId = Math.abs(random.nextInt());
         notificationManager.notify(notificationId, createNotification(notificationId))
    });
}

... 

public Notification createNotification() {
    Intent intent = new Intent(this, ContentActivity.class);
    intent.putExtra("NOTIFICATION_ID", notificationId);
    PendingIntent pi = PendingIntent.getActivity(this, REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    ...
}

ContentActivity中:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_content);

    int notificationId = getIntent().getIntExtra("NOTIFICATION_ID", -1);
    if (notificationId >= 0) {
        NotificationManager notificationManager = getSystemService(NotificationManager.class);
        notificationManager.cancel(notificationId);
    }
}

不理想,但似乎每次都能保证提醒通知,这是我想要的行为。