【问题标题】:How to stop notification's service on Android Oreo如何在 Android Oreo 上停止通知服务
【发布时间】:2017-10-31 13:44:32
【问题描述】:

我们的应用有一些服务和意图服务,它们在用户启动应用时开始运行。即使用户最小化应用程序,也需要启动这些组件以继续运行进程。

在 Android Oreo 上,由于缺少使用 startForegroundService(:intent)startForeground(:id, :notification) 初始化这些服务,我们的应用开始崩溃。我们已经修复了它按要求附加这些通知,但我们发现了一个奇怪的行为。即使应用程序在前台,这些通知也会出现,因为它没有意义,因为我们的服务几乎一直都是短时间运行的,但需要保证 100% 的时间运行。这就是为什么流程在服务上而不是在活动的上下文中运行的原因。我只想在用户最小化应用程序并且服务启动时才显示这些通知。 有什么办法吗?

我无法更改此消息,非常烦人!

这里是一些用于创建频道的代码:

const val SERVICE_CHANNEL_ID = "com.myFunnyApp.notifications"
//.....
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

  val notificationService = context.getSystemService(Context.NOTIFICATION_SERVICE)
  (notificationService as? NotificationManager)?.let { notificationManager ->

    if (notificationManager.getNotificationChannel(SERVICE_CHANNEL_ID) == null) {
      val channel = NotificationChannel(
          SERVICE_CHANNEL_ID,
          context.resources.getString(R.string.test),
          NotificationManager.IMPORTANCE_MIN)
      channel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC
      notificationManager.createNotificationChannel(channel)
      return
    }

  }

}

在服务上,代码运行:

val notification = Notification.Builder(context, SERVICE_CHANNEL_ID)
        .setSubText("subText") //Not working
        .setContentText("contentText") //Not working
        .setSettingsText("settingsText") //Not working
        .setContentTitle("title") //Not working
        .build()
startForeground(1, notification)

目前我正在模拟器上进行测试,我没有任何 Android Oreo 设备。

谢谢!

编辑 1:仅当您设置小图标时,文本才会更改。

【问题讨论】:

  • 您是否在清单中为服务定义了不同的“流程”?您的服务需要多长时间才能完成?

标签: android service kotlin android-intentservice android-8.0-oreo


【解决方案1】:

在 Android 8.0(Android Oreo) 及更高版本中,我们必须在触发通知之前将服务置于前台。

之后,一旦您触发了通知 - 您将不得不停止在前台运行的服务,然后执行以下代码 -

val notification = Notification.Builder(context, SERVICE_CHANNEL_ID)
        .setSubText("subText") //Not working
        .setContentText("contentText") //Not working
        .setSettingsText("settingsText") //Not working
        .setContentTitle("title") //Not working
        .build()
startForeground(1, notification)

stopForeground(true);
stopSelf();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多