解雇后单挑通知卡在全屏模式
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);
}
}
- 如果我点击按钮,然后点击通知,我看到
ContentActivity
并且可以一遍又一遍地重复这个过程。
- 但是,如果我向上滑动从视图中隐藏提醒通知,然后从下拉菜单中单击通知托盘,任何后续我单击
showNotification
按钮 ContentActivity
都会立即显示,并且提示通知 不会出现 。
我希望在随后的按钮点击中仍显示提示通知,即使之前已向上滑动通知。是否还有我遗漏的任何其他标志或设置?
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);
}
}
不理想,但似乎每次都能保证提醒通知,这是我想要的行为。
我看到一些关于正在进行的 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);
}
}
- 如果我点击按钮,然后点击通知,我看到
ContentActivity
并且可以一遍又一遍地重复这个过程。 - 但是,如果我向上滑动从视图中隐藏提醒通知,然后从下拉菜单中单击通知托盘,任何后续我单击
showNotification
按钮ContentActivity
都会立即显示,并且提示通知 不会出现 。
我希望在随后的按钮点击中仍显示提示通知,即使之前已向上滑动通知。是否还有我遗漏的任何其他标志或设置?
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);
}
}
不理想,但似乎每次都能保证提醒通知,这是我想要的行为。