startForeground() 不显示我的通知

Posted

技术标签:

【中文标题】startForeground() 不显示我的通知【英文标题】:startForeground() does not show my Notification 【发布时间】:2012-02-02 07:09:04 【问题描述】:

我正在尝试让我的Service 在前台运行。我尝试使用this example(请查看“在前台运行服务”部分),但startForeground() 实际上并没有显示我的通知。并且不会抛出任何异常。为了让它显示出来,我需要使用NotificationManager 就像here 解释的那样。使用NotificationManager,我的通知有效,但我不确定我的Service 在对startForeground() 进行“无声”调用后是否处于前台。

有什么问题?

编辑:我刚刚测试了this sample project,应该证明startForeground(),但它不起作用!我使用 API v7.0,我在模拟器和真实设备(SE Xperia Neo)上都对其进行了测试。通知未出现。

EDIT2:如果我尝试调用 setForeground(),则会收到警告 setForeground: ignoring old API call

我也尝试使用startForegroundCompat() 描述here,但效果完全一样。我使用ActivityManager.RunningServiceInfo 检查我的服务是否在前台,如here 所述,我发现我的服务不是前台。

【问题讨论】:

由于您选择不提供源代码,因此很难直接帮助您。 Here is a sample project 成功使用startForeground() 我没有提供源代码,因为我的代码与我提供的示例完全相同:goo.gl/xXIvc。感谢您提供示例项目。 我测试了这个示例项目,它不起作用!我使用 API v7.0,我在模拟器和真实设备(SE Xperia Neo)上都对其进行了测试。通知未出现。 示例项目运行良好——我刚刚在 Nexus One、Galaxy Nexus、Nexus S、HTC Desire S 和“API v7.0”模拟器上重新测试了它。要启动服务并显示Notification,请按“启动播放器”按钮。 @CommonsWare,感谢您的宝贵时间。而且,当然,我按下了“启动播放器”按钮 =)。很奇怪,但它不适用于 SE Xperia Neo 和 API v7.0 模拟器。明天我将在某种 Acer 上对其进行测试,但我认为问题出在不同的地方,但我完全不知道可能出了什么问题。 【参考方案1】:

DMitry。我刚刚遇到了你的问题,找到了原因。

如果您的应用正在更改 COMPONENT PackageManager.setComponentEnabledSetting()) 的状态,android 会从前台删除服务及其通知图标。

Bug reported at Nov, 2011

【讨论】:

感谢您的回复,但我的应用不会更改组件的状态,所以这可能是其他原因。【参考方案2】:

我刚刚注意到,如果 id 参数设置为 0startForeground() 不会显示通知图标...

startForeground(0, notification); // Doesn't work...

startForeground(1, notification); // Works!!!

我希望它可以帮助坚持这一点的人。

【讨论】:

哇,这真是一个惊喜。为我修好了。谢谢! 然而文档对于这个 id 值的作用却非常模糊......我对(IMO)糟糕的文档感到非常沮丧-_- 而我的 123 没有用,改成 1 就可以了! @HerrGrumps 文档已经更新,现在有一个警告:“你给 startForeground() 的整数 ID 不能为 0。” (developer.android.com/guide/components/services.html)。迟到总比没有好=P 不要使用太大的整数,如 1337 、 13377331 、 137 。只需使用 0x3, 0x1【参考方案3】:

除了最佳答案。 您还应该检查您是否致电setSmallIcon。 在我的 Android 手机上,如果不致电 setSmallIcon,我将无法获得预期的结果

【讨论】:

也为我工作 谢谢。服务文档中没有提到这一点,但确实应该如此! Android 的官方文档涵盖了 10% 的主题。 +1 这个答案太有用了,我花了一整天的时间试图弄清楚为什么愚蠢的通知行为不正常...... 这也是我的问题;没有setSmallIcon,通知只是说' 正在运行'。感谢您节省了我的时间和痛苦!【参考方案4】:

这可能是一个旧线程,但我想补充一下我刚刚学到的尚未提及的内容:

Service 可能在调用 stopSelf() 后仍然存在,因为有 Activity 已绑定到 Service。事实上,startForeground() 只是不会显示通知,也不会在这种情况下给出任何例外。

【讨论】:

【参考方案5】:

您的服务是启动服务还是绑定服务?我在绑定服务时遇到了同样的问题,但在绑定之前启动服务允许我调用 startForeground(int, notification) 并显示通知。

【讨论】:

对于希望绑定的Service 最佳选择是在onCreate 中显示通知/启动前台,它将在绑定之前调用(onStartCommand 将很快被调用获取初始Intent,通知/前台为时已晚)。谢谢你的线索!【参考方案6】:

在我的情况下,startForeground(...) 调用后没有通知,因为我只使用.setSubText(...) 来设置它的消息(因为它在大多数设备上以较小的字体呈现)。但是,如果您没有使用.setContentText(...)设置消息,小米红米Note 4的某些设备将不会显示任何通知。

希望对某人有所帮助

【讨论】:

以上是关于startForeground() 不显示我的通知的主要内容,如果未能解决你的问题,请参考以下文章

startForeground() 不显示任何通知

startForeground 的错误通知:服务通知的通道无效

如何重用使用 startForeground 创建的通知中的***活动?

想要隐藏通知但获取 Context.startForegroundService() 并没有调用 Service.startForeground()

升级到 Android 8.1 后 startForeground 失败

Android - 为服务实现 startForeground?