启动应用程序时,Android 通知保持打开状态

Posted

技术标签:

【中文标题】启动应用程序时,Android 通知保持打开状态【英文标题】:Android notification stays open when launching app 【发布时间】:2015-04-07 16:49:54 【问题描述】:

我可以通过 AlarmManager 排队和启动通知,我还可以在单​​击通知时启动我的应用程序。不幸的是,当应用程序启动时,通知并没有自行删除。

通知设置:

Intent intent = new Intent(mainActivity, NotificationPublisher.class);
intent.setAction("handle");

PendingIntent pIntent = PendingIntent.getBroadcast(mainActivity, 0, intent, 
                                                    PendingIntent.FLAG_CANCEL_CURRENT);

Notification.Builder builder = new Notification.Builder(mainActivity)
    .setSmallIcon(R.drawable.phone)
    .setContentTitle(title)
    .setContentText(textContent)
    .setAutoCancel(true)
    .setContentIntent(pIntent);
return builder.getNotification();

通知点击播放并点击此功能:

void handle(Context context, Intent intent) 
    System.out.println("handle");
    Context mainContext = Extension.mainContext;
    Activity mainActivity = Extension.mainActivity;
    Intent launchIntent = new Intent(mainContext, mainActivity.getClass());
    launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(launchIntent);

handle 函数将启动活动,但不会从状态栏中删除通知。有趣的是...如果我删除对 startActivity 的调用,通知将关闭。

我尝试过的事情:

手动设置自动取消标志 改用 builder.build() NotificationManger cancel(id) 和/或 cancelAll 使用 NotificationCompat.Builder 对 setContentIntent 使用常规启动意图,而不是手动调用 startActivity

【问题讨论】:

您可以通过在设备上“手动”关闭它来删除它吗? 是的,定期刷卡没有问题。 只是为了交叉检查,您在执行cancel (int id) 时是否使用了相同的通知ID?我想有 4 种方法可以删除任何通知: 1. 用户关闭它 2. setAutocancel 3. cancel (int id)cancelALL 我猜你没有使用 Notification.FLAG_ONGOING_EVENT 标志..对吗?只有一个建议:尝试从您的 handle 方法中使用 cancel (int id) 以显式删除它 我使用了 notificationManager.notify(0, notification);使用 notificationManager.cancel(0)。它似乎没有做任何事情。我也试过cancelAll。用户关闭它总是有效的,并且在构建器中设置了自动取消。我没有使用 FLAG_ONGOING_EVENT。我也尝试过 setOngoing(false) 以确保我没有添加它。 【参考方案1】:

根据您的问题中的这个陈述:

有趣的是...如果我删除对 startActivity 的调用, 通知将关闭。

我假设您的Activity 只是转发Notification

【讨论】:

我修改了通知,改为启动一个没有通知的单独应用程序。问题仍然存在,因此这不是我的答案。 好的。根据您所有的 cmets,这些都没有任何意义。所以显然有一些时髦的事情正在发生。很难远程调试。祝你好运!如果您弄明白了,请告诉我们。 嘿大卫!昨晚有了大突破!我正在使用一种叫做 OpenFL 的东西来构建应用程序。我正在使用名为 (PiratePig) 的示例项目。当我进行与您的评论相关的测试时,我创建了一个名为 VanillaPiratePig 的不同应用程序。 PiratePig 会发出通知,然后 VanillaPiratePig 会被打开。然而,昨晚我尝试打开 gmail 应用程序并没有发生错误。因此,我很确定这是一个性能错误。因为 OpenFL 应用程序在启动负责取消排队通知的 android OS 类时相当笨重,因此没有时间片。【参考方案2】:

我通过在单击通知后 300 毫秒启动我的应用程序来解决此问题。

【讨论】:

以上是关于启动应用程序时,Android 通知保持打开状态的主要内容,如果未能解决你的问题,请参考以下文章

设备重新启动后,地理围栏是不是在 android 中保持活动状态

Android状态栏通知:使其无法清除并返回应用程序(不启动新实例)

Android:手机重启后设置闹钟/提醒

Android实现点击通知栏后,先启动应用再打开目标Activity ,极光推送等推送的也可以参考一下(转)

未触发 Android 通知操作 (PendingIntent)

如何在android应用程序活动和非活动状态下处理推送通知