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
参数设置为 0
,startForeground()
不会显示通知图标...
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
,我将无法获得预期的结果
【讨论】:
也为我工作 谢谢。服务文档中没有提到这一点,但确实应该如此!setSmallIcon
,通知只是说' 正在运行'。感谢您节省了我的时间和痛苦!【参考方案4】:
这可能是一个旧线程,但我想补充一下我刚刚学到的尚未提及的内容:
Service
可能在调用 stopSelf()
后仍然存在,因为有 Activity
已绑定到 Service
。事实上,startForeground()
只是不会显示通知,也不会在这种情况下给出任何例外。
【讨论】:
【参考方案5】:您的服务是启动服务还是绑定服务?我在绑定服务时遇到了同样的问题,但在绑定之前启动服务允许我调用 startForeground(int, notification)
并显示通知。
【讨论】:
对于希望绑定的Service
最佳选择是在onCreate
中显示通知/启动前台,它将在绑定之前调用(onStartCommand
将很快被调用获取初始Intent
,通知/前台为时已晚)。谢谢你的线索!【参考方案6】:
在我的情况下,startForeground(...)
调用后没有通知,因为我只使用.setSubText(...)
来设置它的消息(因为它在大多数设备上以较小的字体呈现)。但是,如果您没有使用.setContentText(...)
设置消息,小米红米Note 4的某些设备将不会显示任何通知。
希望对某人有所帮助
【讨论】:
以上是关于startForeground() 不显示我的通知的主要内容,如果未能解决你的问题,请参考以下文章
startForeground 的错误通知:服务通知的通道无效
如何重用使用 startForeground 创建的通知中的***活动?
想要隐藏通知但获取 Context.startForegroundService() 并没有调用 Service.startForeground()