应用程序在Oreo设备上的前台服务的后台警告上运行

时间:2019-02-22 09:11:32

标签: android

标题很不言自明。对于那些不知道的人,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选项,用户将询问“此应用程序在做什么?”在做他们要求的事情时。

我们如何防止这种情况发生?感谢您的帮助,非常感谢。

0 个答案:

没有答案