在点击通知操作上隐藏Foreground Service的通知

时间:2018-03-02 14:43:34

标签: android android-service android-notifications

我有一个具有前端通知的前台服务的警报应用程序,该通知有两个操作,其中一个向服务发送意图,并且可以根据应用程序配置打开活动。

问题在于,当我点击将意图发送到服务的操作时,通知不会隐藏。当intent打开Activity

时,似乎不会发生这种情况

我不想要没有通知的前台服务,我只是希望它在将意图发送到服务时将其隐藏回通知抽屉

以下是代码:

NotificationCompat.Builder(mAlarmApplication, CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_notification_alarm)
            .setAutoCancel(false)
            .setOngoing(true)
            .setVibrate(LongArray(0))
            .setContentTitle("Title")
            .setContentText("Content")
            .addAction(0, dismissActionText, dismissPendingIntent)
            .setCategory(NotificationCompat.CATEGORY_ALARM)
            .setPriority(NotificationCompat.PRIORITY_MAX)
            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
            .setContentIntent(alarmScreenPendingIntent)
            .setFullScreenIntent(alarmScreenPendingIntent, true)

以下是应用https://play.google.com/store/apps/details?id=com.garageapp.alarmchallenges的链接。

当闹钟启动并且我当前的解决方案是更新旧的抬头通知时,会出现问题,这个新的抬头通知不是一个新的,但是UX不是很好,因为在Android 8+上通知新通知会弹出老化

4 个答案:

答案 0 :(得分:0)

好像您的NotificationService绑定了。如果是这样,那么您必须在Service

中终止通知 你尝试过吗?

public static void cancelNotification(Context ctx, int notifyId) {
    String ns = Context.NOTIFICATION_SERVICE;
    NotificationManager nMgr = (NotificationManager) ctx.getSystemService(ns);
    nMgr.cancel(notifyId);
}

答案 1 :(得分:0)

如果您或用户删除了您的前台通知,您的服务将转到后台,我认为最好的办法是不将前置通知设置为前景而不将其优先级设置为MAX

同时使用两个通知,一个在抽屉中,另一个在抬头:

- 优先级为DEFAULT的第一个通知,用于启动前景(自动取消设置为false,正在设置为true)显示此startForground()

- 第二个通知(抬头(优先MAX)自动取消设置为true并且设置为false),您的操作会显示notifyManager.notify()

这两个通知必须具有不同的ID

另一种解决方案:

如果您想使用一个抬头通知和前台服务操作,您可以这样做:

当用户点击操作时,前台服务必须调用前台服务,然后前台服务可以使用优先级设置为默认值的新通知调用startForeground(具有相同的ID),使用带有前台服务操作按钮的抬头通知如果您的通知无法更新,则可能需要先致电stopForeground(true)notificationManager.cancel(id),然后再通过新通知致电startForeground。这两个通知都应该设置为true并且auto cancel设置为false

在我看来,第一个解决方案比第二个解决方案更好,因为通知可能不会在第二个解决方案中更新。

答案 2 :(得分:0)

您使用的.setOngoing(true)在服务正常时不应删除。

.setAutoCancel(true)也不会与.setOngoing(true)合作。

您必须使用.setOngoing(false)来解除通知。

答案 3 :(得分:0)

正如documentation所说:

  

已启动的服务可以使用startForeground(int,Notification)API将服务置于前台状态,系统认为该服务是用户主动了解的内容......

android系统不允许您在没有通知或隐藏通知的情况下拥有前台服务。这是因为用户意识到他/她的系统正在发生什么。

同样查杀通知将停止您的前台服务。 所以你永远不能拥有这两个选项(前台服务和隐藏通知)

针对您的问题的不清楚解决方案:

当您调用将意图发送给服务的操作时,请使用调解器活动执行此操作,即首先打开一个活动,然后在活动中向服务发送意图。

我希望这能解决你所说的问题:

  

问题是当我点击将意图发送到服务的动作时,通知不会隐藏。当intent打开Activity

时,似乎不会发生这种情况