当前位置: 首页 > 知识库问答 >
问题:

Android前台服务通知不持久

南宫勇军
2023-03-14

我创建了一个扩展服务并作为前台服务运行的类。我希望我的服务通知是持久的(即不通过刷卡删除)。但是,我的通知可以通过刷卡来撤销。

服务留档指出:...前台服务必须为状态栏提供通知,状态栏放在正在进行的标题下。这意味着除非服务停止或从前台删除,否则通知不能被驳回...

我确实设置了断点来检查是否命中了onDestroy()或stop Self(),但事实并非如此。该服务正在前台模式下运行,但我可以通过滑动来驳回通知。

我发现了很多关于相反情况的问题,在服务停止后无法取消通知,但没有发现任何与我的问题类似的问题。

该服务通过Intent启动,并按如下方式初始化:

@Override
public void onCreate()
{
    super.onCreate();

    initialize();
}

private void initialize()
{
    Notification n = get_service_notification();
    startForeground(10, n);

    LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter(BroadcastCodes.service_broadcast_intent_name));
}

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    startServing();
    return START_STICKY;
}

其中start Serving()订阅位置更新

通知是这样构建的

private Notification get_service_notification()
{
    Intent intent = new Intent(this, LoginActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder b = new NotificationCompat.Builder(this);

    b.setAutoCancel(false)
            .setWhen(System.currentTimeMillis())
            .setSmallIcon(R.drawable.app_icon)
            .setTicker("some text")
            .setContentTitle("some text")
            .setContentText("some text")
            .setContentIntent(contentIntent)
            .setContentInfo("")
            .setOngoing(true);

    Notification res = b.build();
    res.flags |= Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;

    return res;
}

我尝试过使用标志和setOngoing/setAuto取消,但结果保持不变。

SDK版本配置为minSdkVersion 18、targetSdkVersion 25

我非常感谢关于这个问题的任何意见——这可能只是一些愚蠢的错误,但我已经花了几个小时试图自己研究...不幸的是,没有用。

编辑1

我还没有解决这个问题。我决定尝试一个肮脏的黑客,但仍然没有运气。

我制作了一个PendingEvent,并通过setDeleteIntent()注册了它。我的想法是,一旦这个通知被刷消,就会显示一个新的通知。不幸的是,我没能让它发挥作用(刷卡时意图永远不会触发)。

我还想澄清,通知可以被刷走,但不会受到通知窗格(垃圾图标)中的“全部清除”按钮的影响(即不会被删除)。

编辑2

如上所述,当通过滑动解除通知时,我无法使用setDeleteIntent()重新创建通知。

现在我解决了一个解决方法——我的服务执行一些定期任务。我现在打电话

notificationManager.notify(10, service_notification);

当我的任务运行时,即使被刷走,我的通知也会在一段时间后重新创建。

我仍然有一种强烈的感觉,我只是误读了文档,因为我的测试设备(Honor API23)上有几个无法删除的通知。

编辑3

我在另一台设备(Lenovo API23)上尝试了相同的代码,通知按预期工作(无法解除,也无法刷卡)。我的问题似乎与设备有关。

共有1个答案

拓拔迪
2023-03-14

我做了一些进一步的测试(除了更新中提到的测试)。我试着在互联网上运行各种示例/教程,比如这里的页面

基于我最初运行测试的荣誉,通知始终可以被滑动,在联想和其他设备上,“正在进行的”标志按照文档中的说明起作用,即不能通过滑动操作解除通知。

总而言之,我的问题似乎确实与设备有关。

 类似资料:
  • 编辑 我的通知是这样创建的,到目前为止,它在数千个API<26的android设备上工作:

  • 所以,我有一个拥有50000用户的应用程序。最近我更新了我的android studio,把SDK编译成了27。我做了一些改变,以支持android 8的变化,包括通知的变化(例如,通知应该有唯一的渠道)。在Android One手机上测试了这个(运行android 8)。一切都很顺利。在更新playstore上的应用程序后,我在android 8设备上看到了这些崩溃(主要是谷歌Pixel手机)

  • 大家好,我是Android应用程序开发的新手,我想在前台播放视频,这意味着当我按下后退按钮、主页按钮甚至处于锁定状态时,视频中的音频应该在播放通知中播放,暂停控制我尝试过,但无法以正确的方式获得正确的结果,有人能帮我做这个操作吗。提前谢谢

  • 我可以在Android 10上使用前台服务在后台进行工作BLE扫描。我的应用程序具有in-manifest Foreground\u服务,并在启动时从用户那里获得premissions ACCESS\u FINE\u位置和ACCESS\u background\u位置。然后用BLE扫描启动前台服务。当屏幕在服务上执行扫描和查找设备时,但当屏幕离开前台时,服务停止工作,扫描停止。 正在启动服务: 使

  • 我是初学扑动的。我的flutter应用程序在kotlin上有一个原生的android后台服务,在那里我有一个套接字在运行,每当套接字侦听一些东西时,我就会使用notificationcompat.builder生成一个通知。 但当用户点击通知时,我无法将Flutter应用程序带回前台。 我尝试创建一个pendingintent并将其传递给notificationbuilder setContent

  • 通知通道的新代码在旧的和最新的奥利奥设备上运行良好,但当我在API 28(android P)设备上测试时,它没有在通知栏中显示通知,这是我用来启动前台通知的行。