Android前台服务通知不持久

时间:2017-06-05 17:04:44

标签: java android notifications

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

服务文档说明:...前台服务必须提供状态栏的通知,该通知位于“正在进行”标题下。这意味着除非服务被停止或从前台删除,否则不能解除通知......

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

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

该服务通过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;
}

其中startServing()订阅位置更新

通知就像这样构建

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;
}

我尝试过使用flags和setOngoing / setAutoCancel,但结果保持不变。

SDK版本配置为minSdkVersion 18,targetSdkVersion 25

我真的很感激有关这个问题的任何意见 - 这可能只是一些愚蠢的错误,但我已经花了超过几个小时尝试自己研究......遗憾的是无济于事。

编辑1

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

我制作了一个PendingIntent,并通过setDeleteIntent()注册了它的想法,一旦刷新了这个通知,就会显示一个新的通知。不幸的是,我无法使其工作(滑动时的意图永远不会发生)。

我还想澄清一下,通知可以通过通知窗格中的全部清除按钮(垃圾邮件图标)来消除,但不会受到影响(即不会被删除)。

编辑2

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

现在我解决了一个问题 - 我的服务做了一些定期任务。我现在正在打电话

notificationManager.notify(10, service_notification);

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

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

编辑3

我在不同的设备(Lenovo API23)上尝试了相同的代码,并且通知按预期工作(不能被解雇且无法刷卡)。我的问题似乎是特定于设备的。

1 个答案:

答案 0 :(得分:0)

我做了一些进一步的测试(除了更新中提到的测试)。我尝试在互联网上运行各种示例/教程,如this page here

在荣誉榜上,我最初正在进行测试,通知总是可以在联想和其他正在进行的" flag的工作原理如文档所述,即不能通过滑动操作解除。

总结一下,我的问题似乎与设备有关。