标题很不言自明。对于那些不知道的人,Android Oreo设备会发出恼人的警告,即如果某个应用程序在后台运行,则会有一个持久性通知,通知您有关该应用程序在“后台”运行。
在我们的应用程序上,我们通过调用Context.startForegroundService(intent)
使用带有通知的长期服务,这是我们在服务内部创建通知的方式:
// Check if the device has Oreo as its lowest OS. Same thing with Build.VERSION_CODES check.
if (Helper.ATLEAST_OREO)
{
// Get notification service.
NotificationManager notifManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// Old notification channel handling.
NotificationChannel oldChannel = notifManager.getNotificationChannel("old_channel");
if (oldChannel != null)
notifManager.deleteNotificationChannel("old_channel");
// Get new channel.
NotificationChannel channel = notifManager.getNotificationChannel("new_channel");
if (channel == null)
{
// If null, create it without sound or vibration.
channel = new NotificationChannel("new_channel", "new_name",
NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription("some_description");
channel.enableVibration(false);
channel.setSound(null, null);
notifManager.createNotificationChannel(channel);
}
// Create builder.
builder = new NotificationCompat.Builder(this, "new_channel");
// Create a pending intent to redirect to startup activity.
intent = new Intent(this, StartUpActivity.class);
intent.setFlags(
Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction("fromNotification"); // for logging purposes
pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
// Generate notification.
builder.setContentTitle(getString(R.string.app_name)) // required
.setSmallIcon(R.drawable.app_icon_white) // required
.setContentText(getString(R.string.notification_description)) // required
.setOngoing(true)
.setOnlyAlertOnce(true)
.setPriority(NotificationManager.IMPORTANCE_DEFAULT)
.setContentIntent(pendingIntent);
// Start foreground service.
startForeground(NOTIFY_ID, builder.build());
}
一切都很好。该服务还具有一个线程,该线程在屏幕打开时会在100毫秒间隔之间连续循环。 (我们正在使用屏幕开关式广播接收器检测到更改,并在服务继续运行时相应地开始完成线程。)
但是,在Oreo设备上,用户可以手动进入通知设置,并删除正在进行的通知,因为该通知在服务运行时会占用空间(在这种情况下一直如此)。用户删除应用程序的通知后,一段时间后会弹出一个通知,提示“应用程序正在后台运行”。使用IGNORE选项,用户将询问“此应用程序在做什么?”在做他们要求的事情时。
我们如何防止这种情况发生?感谢您的帮助,非常感谢。