我有Service
我希望在startForeground()
函数中使用public void putServiceToForeground() {
if (notif == null) {
notif = new NotificationCompat.Builder(this)
.setContentTitle("Location Updates Service")
.setContentText("Getting Location Updates")
.setSmallIcon(R.drawable.ic_launcher)
.setTicker(getText(R.string.location_service_starting))
.build();
}
startForeground(notificationID, notif);
}
public void removeServiceFromForeground() {
if (notif != null && mNotificationManager != null) {
notif.tickerText = getText(R.string.location_service_stopping);
mNotificationManager.notify(notificationID, notif);
}
stopForeground(true);
}
:
onConnected()
我在onDisconnected()
的{{1}}和Service
方法中启动并停止此操作。
在较新的Android
版本中,一切都很好,我没有错误,但在2.3.4中我收到错误:
FATAL EXCEPTION: main
android.app.RemoteServiceException: Bad notification for startForeground:
java.lang.IllegalArgumentException: contentIntent required: pkg=com.mycomp.app id=678567400
notification=Notification(vibrate=null,sound=null,defaults=0x0,flags=0x40)
在阅读SO之后,我假设我需要在用户点击通知时提供contentIntent
吗?这是正常的设置在Service
内吗?我不能将用户返回到我的主Activity
吗?
答案 0 :(得分:4)
我假设我需要在用户点击通知时提供contentIntent吗?
显然是的。我不记得尝试展示Notification
sans contentIntent
,但这似乎肯定是错误所暗示的。
在我的服务中设置是否正常?
通常,您提供contentIntent
以允许用户对Notification
采取行动。在startForegound()
的情况下,它应该引导用户控制服务行为的地方(例如,停止音乐播放器服务)。
我不能将用户返回到我的主要活动吗?
无论你的船漂浮在哪里,让你的用户感到高兴,不一定是重要的。
答案 1 :(得分:0)
您不应尝试启动活动或从服务转到任何活动。通常,除非将startActivity或startActivityForResult从一个Activity调用到另一个Activity,否则不应尝试启动Activity。此外,除非用户要求启动,否则不应尝试启动另一个Activity。您不希望在不允许用户控制其工作流程的情况下推动用户;它是一个用户体验模型,会让用户讨厌你。
这就是通知和PendingIntents存在的原因。当您的服务中的某些内容需要用户注意时,请发布通知。当用户准备好处理该情况时,他或她可以单击该通知以返回到您应用中的活动。如果用户在发布通知时处于其他任务的中间,则允许用户完成工作。
startForeground()用于将服务置于“高”优先级,系统将避免停止它。它用于运行音乐播放器等服务,用户希望服务在大多数情况下继续运行。 startForeground()需要通知,因为规则是如果不以某种方式通知用户持久消息,则无法运行前台服务。 在过去,一些开发人员通过一个技巧解决了这个通知要求:他们提供了一个没有图标的通知。系统不显示没有图标的通知,因此前台服务是“隐藏”的。这个洞已经填满;如果您尝试使用提供给startForeground()的通知执行此操作,系统将为您提供一个图标。